1. 程式人生 > >swift-- Swift 進階

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