<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【翻譯】成為優(yōu)秀 Swift 開發(fā)者的 10 條建議

          共 3902字,需瀏覽 8分鐘

           ·

          2016-11-24 17:55

          在這里給大家分享一些幫助大家成為更優(yōu)秀的Swift開發(fā)者的建議,讓你的代碼,寫的更少,性能更優(yōu) 。

          1. Extension 擴展

          舉例:平方

          // Okay Version
          func square(x: Int) -> Int { return x * x }
          var squaredOFFive = square(x: 5)
          square(x:squaredOFFive) // 625

          創(chuàng)建無效變量,將5平方后再平方 —— 畢竟我們不喜歡打字。

          // Better Version
          extension Int { 
           var squared: Int { return self * self }
          }
          5.squared // 25
          5.squared.squared // 625

          2. Generics 泛型

          舉例:打印數(shù)組中的所有元素

          // Bad Code
          var stringArray = ["Bob", "Bobby", "SangJoon"]
          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) } }

          對于很多無效的函數(shù),我們只需創(chuàng)建一個就可。

          // Awesome Code
          func printElementFromArray(a: [T]) {
           for element in a { print(element) } }

          3. For 循環(huán) vs While 循環(huán)

          舉例:打印5次 “Count”

          // Okay Code
          var i = 0
          while 5 > i {
          print("Count")
          i += 1 }

          創(chuàng)建變量“i”以確保你電腦打印有限的數(shù)字不會崩潰。

          要記住:變量越多 → 記憶越多 → 越麻煩 → bug越多 → 問題越多。蝴蝶效應要謹記

          // Better Code
          for _ in 1...5 { print("Count") }

          4. 有選擇的展開

          舉例:Gaurd let vs if let

          我們來寫一個歡迎新用戶的程序。

          var myUsername: Double?
          var myPassword: Double?
          // Hideous Code
          func userLogIn() {
           if let username = myUsername {
            if let password = myPassword {
             print("Welcome, \(username)"!)
            }
           }
          }

          你看到世界末日的金字塔了嗎?嵌套的代碼太讓人討厭了。堅決不要!把糟糕的代碼去掉,改成更好的。

          // Pretty Code
          func userLogIn() {
           guard let username = myUsername, let password = myPassword 
            else { return } 
           print("Welcome, \(username)!") }

          上下兩者的差別是顯而易見的。如果用戶名或密碼有一個零值,優(yōu)雅的代碼會調(diào)用“return”提前退出。否則,會出現(xiàn)歡迎的信息。

          5. 計算屬性 vs 函數(shù)

          舉例:求圓的直徑

          // Code
          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

          上面創(chuàng)建了兩個互斥函數(shù)。太糟糕了!我們將半徑和直徑之間的點連接起來。

          // Good Code
          var radius: Double = 10
          var diameter: Double {
          get { return radius * 2}
           set { radius = newValue / 2} } 
          radius // 10
          diameter // 20
          diameter = 1000 
          radius // 500

          現(xiàn)在,半徑和直徑變量是互相獨立的。連接越多 → 額外輸入越少 → 錯誤更少 → bug越少 → 問題越少。

          6. 類型安全枚舉

          舉例:售票

          // Simply Bad
          switch "Adult" {
           case "Adult": print("Pay $7")
           case "Child": print("Pay $3")
           case "Senior": print("Pay $4")
           default: print("You alive, bruh?") }

          “Adult”, “Child”, “Senior” → 這是在硬編碼,逐一地將每個情況的字符串打出來,萬萬不可。上面已經(jīng)解釋過,寫太多會出什么問題。我們可一點都不喜歡打字。

          // Beautiful Code
          enum People { case adult, child, senior }
          switch People.adult {
           case .adult: print("Pay $7")
           case .child: print("Pay $3")
           case .senior: print("Pay $4")
           default: print("You alive, bruh?") }

          “.adult”, “.child”, “.senior” 重點標注肯定是沒錯的。如果switch語句超過指定枚舉的范圍遇到一些未知情況,左邊發(fā)生紅色錯誤(),Xcode會報警。—— 找不到合適的表情啦。

          7. 無效合并

          舉例:用戶選擇Twitter主題色

          // Long Code
          var userChosenColor: String? 
          var defaultColor = "Red"
          var colorToUse = "" 
          if let Color = userChosenColor { colorToUse = Color } else
           { colorToUse = defaultColor }

          這代碼太長了,我們縮短一下。

          // Concise AF
          var colorToUse = userChosenColor ?? defaultColor

          上邊代碼的意思是,如果userChosernColor返回零值(無效),選擇defaultColor (red),否則,選擇userChosenColor.

          8. 有條件的合并

          舉例:雞冠頭(SpikyHair)顯高

          // Simply Verbose
          var currentHeight = 185
          var hasSpikyHair = true
          var finalHeight = 0
          if hasSpikyHair { finalHeight = currentHeight + 5} 
           else { finalHeight = currentHeight }

          上面的代碼太長了,我們來給它瘦瘦身。

          // Lovely Code
          finalHeight = currentHeight + (hasSpikyHair ? 5: 0)

          上面的代碼意思是,如果hasSpikeHaire是真實的,最后的高度增加5;如果是假的,最后的高度加0(不增加)。

          9. 函數(shù)式編程

          舉例:獲取偶數(shù)

          // Imperative (a.k.a boring)
          var newEvens = [Int]()
          for i in 1...10 {
           if i % 2 == 0 { newEvens.append(i) } }
          print(newEvens) // [2, 4, 6, 8, 10]

          不需要了解全過程。review上面的for循環(huán)太浪費時間了,其實可以更清晰一些。

          // Declarative 
          var evens = Array(1...10).filter { $0 % 2 == 0 } 
          print(evens) // [2, 4, 6, 8, 10]

          函數(shù)式編程是現(xiàn)象級的,會讓你變得更聰明。

          10. Closure vs Func

          // Normal Function 
          func sum(x: Int, y: Int) -> Int { return x + y }
          var result = sum(x: 5, y: 6) // 11

          不需要記住函數(shù)和變量的名字。

          // Closure
          var sumUsingClosure: (Int, Int) -> (Int) = { $0 + $1 }
          sumUsingClosure(5, 6) // 11 
          瀏覽 120
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人一区二区三区四区五区 | 国产乱叫456在线 | 天天干天天谢天天插 | 色五月综合| 日韩三级久久久 |