Swift程式設計入門外傳 — 3.0版修訂補充包

“Swift程式設計入門”當初撰寫時,Swift 還是1.2版,才一眨眼的功夫它就進化到 3.0 版。彼得潘特別將書中一些需調整的內容整理出來,希望可以幫助大家在閱讀時無痛轉換到 3.0 版。

  • 點選Edit -> Emoji & Symbols 打開特殊字元的輸入視窗。

修改p3–4,原本是點選Edit -> Special Characters

  • Console (Debug Area) 搬了家,搬到 Playground 視窗的下半部。

修改p3–7,原本Console在視窗右邊的Assistant Editor。

  • Swift 3 只有 for in,沒有傳統的 for 迴圈語法。

上圖的 for 語法在 Swift 3 是不支援的。

  • Swift 3 不支援 ++ 和 — — 的語法

可改成以下的寫法:

  • 點選迴圈的結果,從右鍵選單可切換顯示 Latest Value(最後結果), Value History(歷次結果的列表)或 Graph(歷次結果的折線圖)。

修改5–14,補充迴圈結果的切換功能。

  • 透過字串的 characters 屬性才能存取字串裡的每個字。

修改5–18,原本圖5–30的程式碼會有錯誤。

for char in name {

  • do while 變成 repeat while。

修改p5–19,原本圖5–32的程式碼使用 do while 會有錯誤。

  • optional 資料在 Playground 右邊的結果顯示區塊,直接顯示包含的內容,不再包含{ Some }。

修改p6–5,原本顯示的結果為{Some 18}。

  • function的每個參數都會自動產生同名的外部參數名。

參考上圖的修改,其它書中呼叫 function 的地方,記得都要加上自動產生的外部參數名。

移除 7–4 節: Swift 3 的第一個參數也會自動產生外部參數名。

移除 7–5 節: 不需要加 # ,function的每個參數都會自動產生同名的外部參數名。

  • 利用 _ 可消除自動產生的外部參數名。
  • 不同的外部參數名即代表不同的 function。

修改p7–13的圖7–27和圖7–28。

  • function 的參數不能加 var。

移除p7–16 的圖7–33。

  • print 一統江湖,再也沒有 println 生存的空間。

print 預設將列印換行的結果。若不想換行,可利用 terminator 參數傳入空字串,取代原本預設換行的\n。terminator 參數傳入的字串將加在字串的尾巴。若包含 separator 參數,在 separator 之前可傳入多組字串,這些字串最後將組合在一起,被指定的 separator 字串分隔。

修改7–18小節,列印字串的print和println。切記,println已經不能再使用,把它徹徹底底從記憶裡抹去吧。

  • 7–19 幫程式碼分類的標記語法
    新版的 playground 看不到標記,不過在專案裡還是看得到的。
  • 移除 7–20 節,Swift 3 沒有curried function。
  • 想將字串轉換為整數,需使用Int的initialiser。

此 initialiser 將回傳 optional 的 Int,當傳入的參數為非整數的字串時,將回傳 nil。

修改11–9,字串的toInt( )方法已被移除,不能再呼叫。

  • 將2個 array 相加的方法從 extend 變成append(contentsOf:)。

修改p13–4,原來將2個array相加的方法是extend,現在變成 append(contentsOf:)。不過其實高手只打一個字,一個 + 就可以相加array。

  • 插入成員在 array 特定位置的 function 改成 insert(_:at:) 。

修改 p13–5的圖13–10。

  • array 移除成員的 function 變成 remove(at:) 和 removeSubrange(_:)。

修改 p13–7 的圖13–13。

  • 以同樣內容初始 array 的 function 變成 init(repeating:count:)。

修改 p13–9 的圖13–18。

  • 反轉 array 的 function reversed 和 reverse 。

修改 p13–9 的圖13–20。function reversed 回傳反轉後的 array,原本的 array 不受影響。function reverse 將原本的 array 反轉,不回傳任何東西。

  • dictionary 移除成員的 function 變成 removeValue(forKey:)。

修改 p13–13 的圖13–28。

  • 14–2 節的強制轉型從 as 變成 as!。

改成用 as! 強制轉型,比方圖14–6改成如上圖所示。

  • 在 protocol 裡宣告 optional 的方法屬性時,protocol 和 方法屬性前都要加上 @objc 。

修改 p15–7 的圖15–10。

  • id 變成 Any,NSArray 變成 [Any],NSDictionary 變成 [AnyHashable : Any]。

修改 p18–8。

  • iOS SDK 的 function 在 Swift 3 有所改變。

修改 p18–8 的圖18–10,Swift 版變成 application(_:didFinishLaunchingWithOptions:)。

修改 p18–9 的圖18–11,Swift 版變成 performSegue(withIdentifier:sender:)。

  • iOS SDK enum 型別裡的 case 改成開頭小寫。

修改 p18–12 的圖18–15。

  • RawOptionSetType 改成 OptionSet。

修改 p18–14 的圖18–17。

  • selector 語法調整。

修改 p18–14 的 selector 的使用。

  • Swift 3 可以呼叫 performSelector(inBackground:with:) 和 perform(_:with:afterDelay:)。

修改 p18–15 的 performSelector 的替代方案。

  • 附錄A的Swift Standard Library,map, reduce, filter, stride, sort和sorted function,都不能再被當成獨立的global function呼叫。
  • 修改A-1,A-2,A-3,A-5,在 Swift 3 沒有 map,reduce,filter ,sort,sorted 的 global function。
  • 修改A-4,stride語法調整。

參考 Swift 3的 for 迴圈不只會每次加 1