- Swift和oc的差異:
- 在 Swift 中沒有了 main.m,@UIApplicationMain 是程式入口
- 在 Swift 中隻有 .swift 檔案,沒有 .h/.m 檔案的區分
- 在 Swift 中,一個類就是用一對 {} 括起的,沒有 @implementation 和 @end
- 每個語句的末尾沒有分号,在其他語言中,分号是用來區分不同語句的
- 在 Swift 中,一般都是一行一句代碼,是以不用使用分号
- 與 OC 的文法快速對比
- 在 OC 中 alloc / init 對應 ()
- 在 OC 中 alloc / initWithXXX 對應 (XXX: )
- 在 OC 中的類函數調用,在 Swift 中,直接使用 .
- 在 Swift 中,絕大多數可以省略 self.,建議一般不寫,可以提高對語境的了解(閉包時會體會到)
- 在 OC 中的 枚舉類型使用 UIButtonTypeContactAdd,而 Swift 中分開了,操作熱鍵:回車 ->向右 -> .
- Swift 中,枚舉類型的字首可以省略,如:.ContactAdd,但是:很多時候沒有智能提示
- 監聽方法,直接使用字元串引起
- 在 Swift 中使用 print() 替代 OC 中的 NSLog
- 常量和變量
- let 定義常量,一經指派不允許再修改
- var 定義變量,指派之後仍然可以修改
自動推導:
- Swift能夠根據右邊的代碼,推導出變量的準确類型
- 通常在開發時,不需要指定變量的類型
- 如果要指定變量,可以在變量名後使用:,然後跟上變量的類型
- Swift 對資料類型要求異常嚴格,任何時候,都不會做隐式轉換
- 應該盡量先選擇常量,隻有在必須修改時,才需要修改為 var
- Optional
- 定義變量時,如果指定是可選的,表示該變量可以有一個指定類型的值,也可以是 nil
- 定義變量時,在類型後面添加一個 ?,表示該變量是可選的
- 變量可選項的預設值是 nil
- 常量可選項沒有預設值,主要用于在構造函數中給常量設定初始數值
??操作符:
- ?? 運算符可以用于判斷 變量/常量 的數值是否是 nil,如果是則使用後面的值替代
- 在使用 Swift 開發時,?? 能夠簡化代碼的編寫
- 控制流
if:
- Swift 中沒有 C 語言中的非零即真概念
- 在邏輯判斷時必須顯示地指明具體的判斷條件 true / false
- if 語句條件的 () 可以省略
- 但是 {} 不能省略
三目運算:
Swift 中的 三目 運算保持了和OC 一緻的風格
可選項判斷
- 由于可選項的内容可能為 nil,而一旦為 nil 則不允許參與計算
- 是以在實際開發中,經常需要判斷可選項的内容是否為 nil
- if let 不能與使用 &&、|| 等條件判斷
- 如果要增加條件,可以使用 where 子句
- 注意:where 子句沒有智能提示
iflet n =name, let a = age {
print(n,a)
}
Guard:
guard 是與 if let 相反的文法,Swift 2.0推出的
- 能夠判斷每一個值
- 在真正的代碼邏輯部分,省略了一層嵌套
guardlet n = nameelse {
return
}
Switch:
- switch 不再局限于整數
- switch 可以針對任意資料類型進行判斷
- 不再需要 break
- 每一個 case後面必須有可以執行的語句
- 要保證處理所有可能的情況,不然編譯器直接報錯,不處理的條件可以放在 default 分支中
- 每一個 case 中定義的變量僅在目前 case 中有效,而 OC 中需要使用 {}
- 循環
- oc風格:
var sum =0
forvar i =0; i <10; i++ {
sum += i
}
print(sum)
- for-in,0..<10表示從0到9
sum = 0
for iin0..<10 {
sum += i
}
print(sum)
- 範圍 0...10 表示從0到10
- 省略下标
- _ 能夠比對任意類型
- _ 表示忽略對應位置的值
for _ in 0...10 {
print("hello")
}
- 字元串
- 在 Swift 中絕大多數的情況下,推薦使用 String 類型
- String 是一個結構體,性能更高
- String 目前具有了絕大多數 NSString 的功能
- String 支援直接周遊
- NSString 是一個 OC 對象,性能略差
- Swift 提供了 String 和 NSString 之間的無縫轉換
- 周遊字元串中的字元:
for sin str.characters {
print(s)
}
字元串長度:
let len2 =str.characters.count
// 傳回 utf8編碼長度
let len3 = str.utf8.count
- 字元串拼接
- 直接在 "" 中使用 \(變量名) 的方式可以快速拼接字元串
- 可選項的拼接
- 如果變量是可選項,拼接的結果中會有 Optional
- 為了應對強行解包存在的風險,蘋果提供了 ?? 操作符
- ?? 操作符用于檢測可選項是否為 nil
- 如果不是 nil,使用目前值
- 如果是 nil,使用後面的值替代
- Range:
- 在 Swift 中,String 和 Range連用時,文法結構比較複雜
- 如果不習慣 Swift 的文法,可以将字元串轉換成 NSString 再處理
- 數組
- 可變&不可變
- let 定義不可變數組
- var 定義可變數組
- 可變&不可變
let array = ["zhangsan","lisi"]
- 數組的類型:
- 如果初始化時,所有内容類型一緻,擇數組中儲存的是該類型的内容
- 如果初始化時,所有内容類型不一緻,擇數組中儲存的是 NSObject
- 數組的定義和執行個體化
- 使用 : 可以隻定義數組的類型
- 執行個體化之前不允許添加值
- 使用 [類型]() 可以執行個體化一個空的數組
var array3:[String]
//: 執行個體化之前不允許添加值
//array3.append("laowang")
//: 執行個體化一個空的數組
array3 = [String]()
array3.append("laowang")
- 數組的合并:
- 必須是相同類型的數組才能夠合并
- 開發中,通常數組中儲存的對象類型都是一樣的!
- array3 += array1
- 記憶體配置設定:
如果向數組中追加元素,超過了容量,會直接在現有容量基礎上 * 2
- 字典:
- 同樣使用 [] 定義字典
- let 不可變字典
- var 可變字典
- [String : NSObject] 是最常用的字典類型
var dict = ["name":"zhangsan","age":18]
- 指派:
- 指派直接使用 dict[key] = value 格式
- 如果 key 不存在,會設定新值
- 如果 key 存在,會覆寫現有值
- 周遊:
- k,v 可以随便寫
- 前面的是 key
- 後面的是 value
-
for (k, v) in dict {
print("\(k) ~~~ \(v)")
}
- 函數
- 函數的定義
- 格式 func函數名(行參清單) -> 傳回值 {代碼實作}
- 調用 let result =函數名(值1,參數2:值2...)
- 函數的定義
funcsum(a: Int, b: Int) ->Int{
return a + b
}
let result = sum(10, b:20)
- 沒有傳回值的函數定義:
funcdemo(str: String) ->Void{
print(str)
}
funcdemo1(str:String) ->() {
print(str)
}
funcdemo2(str: String) {
print(str)
}
- 外部參數:
- 在形參名前再增加一個外部參數名,能夠友善調用人員更好地了解函數的語義
- 格式:func函數名(外部參數名形式參數名:形式參數類型) ->傳回值類型 { //代碼實作 }
- Swift 2.0 中,預設第一個參數名省略
-
funcsum1(num1 a: Int, num2 b: Int) ->Int {
return a + b
}
-
- 閉包
- 與 OC 中的 Block 類似,閉包主要用于異步操作執行完成後的代碼回調,網絡通路結果以參數的形式傳遞給調用方
- 定義一個閉包:
- 閉包 = { (行參) -> 傳回值 in // 代碼實作 }
- in 用于區分函數定義和代碼實作
let sumFunc = { (num1 x: Int, num2 y: Int) -> Intin
return x + y
}
sumFunc(num1: 10, num2:20)
- 最簡單的閉包:
let demoFunc = {
print("hello")
}
- 循環引用:
- Swift
- [weak self]
- self是可選項,如果self已經被釋放,則為nil
- [unowned self]
- self不是可選項,如果self已經被釋放,則出現野指針通路
- [weak self]
- Swift
loadData { [weakself]in
print("\(self?.view)")
}
loadData { [unownedself]in
print("\(self.view)")
}
- Objc
- __weak typeof(self) weakSelf;
- 如果self已經被釋放,則為nil
- __unsafe_unretained typeof(self) weakSelf;
- 如果self已經被釋放,則出現野指針通路
- __weak typeof(self) weakSelf;