有 OC 经验的程序员快速学习 Swift 语法
前言
蘋果官方推出 Swift 語言至今,已經過了 7 年之久,Swift 也更新到了 5.5 版本, 它的語法和 API 也趨向于穩定。最近閑來無事,決定開始研究這 iOS 開發編程語言的語法。因為之前有多門編程語言的使用經驗,所以本文主要記錄一些個人認為比較新奇的 Swift 語法。
中文版 Swift 文檔:https://swift.bootcss.com/
Swift 語言開源鏈接:https://github.com/apple/swift
MJ 的 Swift 教學視頻:https://www.bilibili.com/video/BV1uZ4y1T7G5
文章目錄
- 前言
- Swift PlayGround
- Swift 語法
- 可選類型與nil
- 忽略參數標簽
- 可變參數
- inout 關鍵字
- 后記
Swift PlayGround
所謂 “工欲善其事,必先利其器”。要想更好地學習 Swift 的語法,我們也需要合理使用開發工具 Xcode,通往們是通過 PlayGround 來進行 Swift 的語法練習。
我們可以通過 File -> New -> PlayGround(如下圖所示),新建一個 PlayGround。
接著選擇 Black -> Next,完成 PlayGround 的創建。
為了方便劃分我們的單元練習,PlayGround 還支持多 Page 功能,每個 PlayGround Page 可以保存一份練習的 Swift 代碼。我們可以通過下面兩種方法新建 PlayGround Pag。
方法一:點擊 File -> New -> PlayGround Page
方法二:雙擊 PlayGround 名稱,選擇 New PlayGround Page。
Swift 語法
可選類型與nil
在 OC 中,nil 只能賦值給 OC 對象,表示一個不指向任何對象的指針。而在 Swift 中,nil 意義有所不同,它表示值缺失(即沒有值)的情況,可以用于任意類型的值缺失(包括基本類型、枚舉、結構體和對象等)。
可選類型表示的是該類型的變量的值有可能出現缺失的情況,在類型后面加上 ? 就可以表示可選類型。如下所示:
// 可選類型,沒賦值默認為 nil var num: Int?swift 是強類型語言,我們通常不能直接把可選類型直接賦值給基本類型,當我們確定可選類型變量一定包含值之后,可以在后面添加 ! 來取值。
var num: Int? = 1024 // 對可選類型進行強解析(要確保它有值) var specialNum: Int = num!忽略參數標簽
我們在聲明函數的時候,需要把寫明參數名。然后與之相對地,在調用函數的時候也需要寫上參數名,如下面代碼所示:
func sayHello(name: String) {print("Hello, \(name)~") }// 在調用的時候,需要把參數名 name: 帶上 sayHello(name: "Veggie")有時候,我們會覺得這樣帶參數名的函數調用方式比較麻煩,希望可以在調用的時候忽略它。這時,我們可以用忽略參數標簽 _ 來簡化它,用法如下面代碼所示。
// 在參數標簽前面加上 _ func sayHello(_ name: String) {print("Hello, \(name)~") }// 函數調用時可以不需要 sayHello("Veggie")可變參數
Swift 像其他高級語言一樣,它的函數也支持可變參數的輸入。一個可變參數可以接收零個或多個參數,可以使用在參數個數不確定的場景,我們通過在參數后面添加 ... 來定義可變參數。需要注意的是,一個函數只能有一個可變參數。使用例子如下所示:
func arithmeticMean(_ numbers: Double...) -> Double {var total: Double = 0for number in numbers {total += number}return total / Double(numbers.count) }// 輸出 3.0, 是這 5 個數的平均數。 print(arithmeticMean(1, 2, 3, 4, 5))// 輸出 10.0, 是這 3 個數的平均數。 print(arithmeticMean(3, 8.25, 18.75))可以看到可變參數在傳入函數后會變成對應類型的數組,因此我們在大多是場景中可以直接使用數組代替。
inout 關鍵字
進行函數調用的時候,我們傳參默認都是進行值傳遞,在函數內部改變參數的值,不會引起函數外部變量的改變。當我們希望進行引用傳遞的時候,可以用上 inout 關鍵字。在傳參的時候,傳入的變量需要用 & 修飾,是 C 語言類似。
// 交換 a 和 b 的值 func swapValue(_ v1: inout Int, _ v2: inout Int) {let temp = v1v1 = v2v2 = temp }var a: Int = 1, b: Int = 2 // 傳入的參數需要加上 &,進行地址傳遞 swapValue(&a, &b) // 打印變量交換后的結果 print(a, b)需要注意的是:
- 可變的參數不能標記為 inout
- 標記為 inout 的參數不能帶默認值
后記
Swift 語法的快速學習,只是為了幫助我們快速看懂 Swift 項目中的代碼,能夠窺探其他人的編程思路,并能對現有的代碼進行簡單的定制化修改。
如果希望能熟練使用 Swift 語言,關鍵還是要自己多寫,可以多利用新學的語法寫小 Demo, 或者刷 LeetCode 題目。語法使用得多了,就很容易形成肌肉記憶,所謂的「Practice makes perfect」就是如此吧。
編碼實踐的另一個好處就是,有助于我們發現自身當前知識的缺陷。比如,我們在寫 for 循環的時候,只是看看一下大概的寫法,當我們需要去寫逆序遍歷的時候,我們就會發現所學的 ... 和 ..< 都是在應付正序的情形,于是我們就會學到 stride 函數。這種對知識點的查漏補缺,可以彌補理論學習中的不足,幫助我們健全知識體系,解決實際問題。
內容在持續更新中……
總結
以上是生活随笔為你收集整理的有 OC 经验的程序员快速学习 Swift 语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 多线程基础之 NSThread
- 下一篇: 解决 VSCode 配置 tab 空格数