swift-- Swift 進階
聽說你已經學習Swift幾個月了,有沒有想更進一步成為Swift高手的想法?我這裡有10招祕技,各位施主且聽我慢慢道來,結個善緣。
1. 擴充套件(Extension)
任務: 求數字的平方。
// 菜鳥版
func square(x: Int) -> Int { return x * x }
var squaredOfFive = square(x: 5)
square(x: squaredOfFive) // 625
為了求5的四次方我們被迫建立變數 squaredOfFive — 高手可不喜歡被迫定義一個無用的變數。
// 高手版
extension Int {
var squared: Int { return self * self }
}
5.squared // 25
5.squared.squared // 625
2. 泛型(Generics)
任務:列印輸出陣列內所有的元素。
// 菜鳥版
var stringArray = ["蒼老師", "範老師", "優衣庫"]
var intArray = [1, 3, 4, 5, 6]
var doubleArray = [1.0, 2.0, 3.0]
func printStringArray(a: [String]) {
for s in a {
print(s)
}
}
func printIntArray(a: [Int]) { for i in a { print(i) } }
func printDoubleArray(a: [Double]) {for d in a { print(d) } }
居然要定義這麼多函式? 菜鳥能忍高手不能忍!!!
// 高手版
func printElementFromArray<T>(a: [T]) {
for element in a {
print(element)
}
}
3. For 遍歷 vs While 遍歷
任務:列印 5 次 陸家嘴
// 菜鳥版
var i = 0
while 5 > i {
print("陸家嘴")
i += 1
}
被迫定義了變數 i 來確保列印 陸家嘴 5 次。
注意定義越多的變數,越多的潛在風險,越多的生活問題。這就是蝴蝶效應,你難道想X生活不和諧?
// 高手版
for _ in 1...5 {
print("陸家嘴")
}
上面的程式碼實在是簡潔,美妙。
4. Gaurd let vs if let
任務 : 讓我們寫個歡迎新使用者的程式。
var myUsername: Double?
var myPassword: Double?
// 菜鳥版
func userLogIn() {
if let username = myUsername {
if let password = myPassword {
print("優衣庫歡迎, \(username)"!)
}
}
}
這些令人討厭的巢狀程式碼,我們要消滅它
// 高手版
func userLogIn() {
guard let username = myUsername, let password = myPassword
else { return }
print("優衣庫歡迎, \(username)!")
}
注意這裡如果myUsername 或 myPassword nil,都會提前結束,否則就會列印 “優衣庫歡迎, XXX”
5. 計算屬性 vs 函式
任務:計算圓的直徑
// 菜鳥版
func getDiameter(radius: Double) -> Double { return radius * 2}
func getRadius(diameter: Double) -> Double { return diameter / 2}
getDiameter(radius: 10) // return 20
getRadius(diameter: 200) // return 100
getRadius(diameter: 600) // return 300
上面我們建立了2個毫無關係的函式,可是直徑和周長兩者真的沒有關係嗎?
// 高手版
var radius: Double = 10
var diameter: Double {
get { return radius * 2}
set { radius = newValue / 2}
}
radius // 10
diameter // 20
diameter = 1000
radius // 500
現在半徑和直徑相互依賴,真實地反應了兩者的關係。
記得上面說的蝴蝶效應嗎? 越少的依賴,程式碼越簡潔,問題越少,生活越美好!
6. 列舉 - 型別安全
任務:賣門票
// 菜鳥版
switch "Adult" {
case "Adult": print("請付 50 元")
case "Child": print("請付 25 元")
case "Senior": print("請付 30 元")
default: print("你確認不是殭屍嗎,哥們?")
}
“Adult”, “Child”, “Senior” 這裡都是硬編碼,你每次需要輸入手動輸入這些字元,記得我們上面講到的嗎? 手動鍵入越少,錯誤越少,生活越美好。
// 高手版
enum People { case adult, child, senior }
switch People.adult {
case .adult: print("請付 50 元")
case .child: print("請付 25 元")
case .senior: print("請付 30 元")
default: print("你確認不是殭屍嗎,哥們?")
}
這樣你就避免了不小心輸入錯誤的問題,因為 “.adult”, “.child”, “.senior” 被定義成了enum', 任何不在預定義範圍內的例項都會被Xcode毫不留情的指出來,合理利用整合開發環境是高手必備的。
7. 空合運算子
任務: 使用者選擇微博主體顏色。
// 菜鳥版
var userChosenColor: String?
var defaultColor = "Red"
var colorToUse = ""
if let Color = userChosenColor {
colorToUse = Color
} else {
colorToUse = defaultColor
}
這也太臃腫了吧,讓我們來減減肥。
// 高手版
var colorToUse = userChosenColor ?? defaultColor
稍微解釋一下, 如 userChosenColor 為 nil, 則選擇 defaultColor, 否則則userChosenColor.
其實空合運算子是對以下程式碼的簡短表達方法。
a != nil ? a! : b
8. 三目運算子
Ex) 有雞冠頭的人身高增加5釐米。
// 菜鳥版
var currentHeight = 185
var hasSpikyHair = true
var finalHeight = 0
if hasSpikyHair {
finalHeight = currentHeight + 5
} else {
finalHeight = currentHeight
}
太囉嗦,還是需要減減肥!
// 高手版
finalHeight = currentHeight + (hasSpikyHair ? 5: 0)
如果是雞冠頭,就增加 5 釐米高度,否則增加 0 釐米。
9. 函數語言程式設計
任務: 獲取偶數。
// 菜鳥版
var newEvens = [Int]()
for i in 1...10 {
if i % 2 == 0 {
newEvens.append(i)
}
}
print(newEvens) // [2, 4, 6, 8, 10]
這種for迴圈真是冗長,讓人看的昏昏欲睡。
// 高手版
var evens = (1...10).filter { $0 % 2 == 0 }
print(evens)
// [2, 4, 6, 8, 10]
有沒有感覺函數語言程式設計讓你看起來聰明多了。
10. 閉包 vs 函式
任務: 求兩個數字的和。
// 菜鳥版
func sum(x: Int, y: Int) -> Int {
return x + y
}
var result = sum(x: 5, y: 6) // 11
為了這個功能我還需要記住函式名 和 變數名? 能不能少一個呢?
// 高手版
var sumUsingClosure: (Int, Int) -> (Int) = { $0 + $1 }
sumUsingClosure(5, 6) // 11
十條技巧講述完畢,打完收工。
推薦閱讀:
原文連結:http://www.jianshu.com/p/eabaaae88533