盤點開發者最喜愛的Swift技巧
【譯者注】每每編譯Swift的文章時,總有種花樣作死的感覺。對於任何一個專業詞彙,都要費盡心思地去Google查詢,翻閱中英兩版的《Swift Programming Language》,仔細對比。不過翻譯完,成就感卻比其他文章多得多。對Swift總有種莫名的好感,也許是因為是蘋果粉,也許僅僅只是因為Swift本身。這篇文章在釋出並在微博推廣之後,得到了包括唐巧、SwiftLanguage等在內的技術專家好評,起初非常忐忑的心也終於得以安定。
譯文如下:
屈指算來,Swift語言才釋出半年左右,卻已深得眾多開發者的青睞,也有了許許多多的學習資源、專案和工具。在本文中,來自objc.io、LinkedIn等各個公司的軟體工程師及資深開發者總結了自己在接觸Swift過程中最喜愛的貼士與技巧,有些技巧即使是很早就入坑Swift的開發者都不知道,不妨一起來了解一下吧。
Natasha Murashev——Capital One iOS工程師、Natasha The Robot博主
當我在構建iOS應用時,Swift能夠允許更多的函數語言程式設計方法,所以,為了能在改善Swift程式碼時做出更好的決策,我一直在學習函數語言程式設計。迄今為止,我最喜歡的函式方面的Swift資源有:
- 功能型函式——能輕鬆更改函式,讓程式碼更獨立、可測試。
- 包裝型別——我喜歡用可讀且安全的類型別名來編寫程式碼。
- 型別設計——在設計程式時大幅使用正確的型別,有利於編譯器除錯。
- Swift中柯里化函式的運用——在Haskell中,某種型別的函式指標只能指向特定引數型別和數目以及返回值型別的函式,而Swift則允許“currying”或部分應用函式,從而實現程式碼塊可重複使用。
- Swift奇妙的差錯處理——與Objective-C相比,我特別喜歡這種簡單、可讀性強而又安全的錯誤處理方式。
- 面向物件程式設計直達車——它為在程式碼中進行錯誤處理提供了一種最快捷的方式,於程式猿而言,最幸福之事莫過於此。
- Swift函數語言程式設計——這是一本關於Swift函式比較深度的書籍,我每次重新讀過時都會發現不一樣的點,非常適合想要深入研究Swift函式以及如何將其運用到iOS程式碼中的開發者們閱讀。
Chris Eidhof——objc.io創始人、《Swift函數語言程式設計》作者
快速排序(Quicksort)——Swift中的快速排序實現可以說是前無古人後無來者,大多數Quicksort實現都需使用固定的記憶體,而Swift則能以最簡潔清晰的程式實現快排:
func qsort(input: [Int]) -> [Int] {
if let (pivot, rest) = input.decompose {
let lesser = rest.filter { $0 < pivot }
let greater = rest.filter { $0 >= pivot }
return qsort(lesser) + [pivot] + qsort(greater)
} else {
return []
}
}
Austin Zheng——LinkedIn高階軟體工程師
我認為,精妙的Swift技巧應當如此:開發者可以通過建立一個已定義標準類的閉包來為匿名類例項設定委託,而閉包則將返回該類的一個新例項,並執行。示例程式碼如下:
import Foundation
protocol SomeDelegateProtocol : class {
func firstFunc() -> String
func secondFunc() -> Bool
}
class MyClass {
weak var delegate : SomeDelegateProtocol?
}
class Parent {
var child : MyClass
var strongDelegate : SomeDelegateProtocol? = nil
func setup() {
strongDelegate = {
// [self] // Original version had this not commented; it's commented to let people know it was a typo
class SomethingClass : SomeDelegateProtocol {
func firstFunc() -> String { return "foo" }
func secondFunc() -> Bool { return true }
}
return SomethingClass()
}()
child.delegate = strongDelegate
}
init() {
self.child = MyClass()
self.setup()
}
}
var bleh = Parent()
var result = bleh.child.delegate?.firstFunc()
println("Got \(result!)")
Clay Smith——PagerDuty高階軟體工程師
下面是我在處理所有Xcode問題(尤其是sourcekit)時所使用的最基本的Bash alias(命令別名),用來刪除Xcode中的Derived Data:
alias sourcekitsad='rm -rf ~/Library/Developer/Xcode/DerivedData'
Michael Helmbrecht——Motiv UX設計師兼iOS開發者
於我而言,最喜歡的一點應該是Swift能在String型別和NSString型別中自動轉換,當無法列印String時,通過直接呼叫NSString的-description方法即可實現。
David Kobilnyk——ShopRunner軟體工程師
作為一門程式語言,我覺得Swift還不夠優雅,而我也並沒有發現什麼太特別的技巧,只是很喜歡原始型別、列舉一起使用,就像這樣:
public enum ReminderTimeType: String {
case Evening = "this evening"
case Tomorrow = "tomorrow"
case Weekend = "this weekend"
case NextWeek = "next week"
case CoupleWeeks = "in a couple weeks"
case CoupleMonths = "in a couple months"
case Someday = "someday"
public static let array = [
Evening, Tomorrow, Weekend, NextWeek, CoupleWeeks, CoupleMonths, Someday
]
public static let rawArray = array.map { $0.rawValue }
}
Alexis Gallagher——高階iOS開發者
要說我最喜歡的Swift技巧,應該有兩個,一個是在REPL中,handy函式可直接用於獲取表示式靜態型別,而想要獲取任意例項值的型別名稱則可直接呼叫_stdlib_getDemangledTypeName。
func typeof<T>(@autoclosure () -> T) -> Any.Type { return T.self }
JP Simard——Realm iOS工程師
開發者可以直接使用nm工具通過libswiftCore.dylib來獲取所有私有的Swift標準庫函式,比如_stdlib_getTypeName()、_stdlib_demangleName()和_stdlib_conformsToProtocol():
cd `xcode-select -p`/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
nm -a libswiftCore.dylib | grep "T _swift_stdlib_"
當結構體中的所有成員屬於同一型別時(比如浮點型),通過Swift,開發者可以將其中的同類陣列作為一個指標指向結構體中的成員型別。這一方法,讓我能夠非常簡便地去建立頂點資料的Metal緩衝區,而無需其他多餘的複雜操作。
Mustafa Furniturewala——Coursera軟體工程師
我最喜歡的Swift資源是Swifter,對我來說,它是程式設計必備的參考指南,而最喜歡的技巧則是開發者可以使用任意的Swift函式來實現Objective-C風格的動態分配。