邏輯分支
簡單體驗
var i = 10
if i > 0 {
print("OK")
}
- 階段性小結
-
Swift
中沒有 C 語言中的非零即真
概念 - 在邏輯判斷時必須顯示地指明具體的判斷條件
-
if
語句條件的()
可以省略 - 但是
{}
不能省略
-
三目
var a = 10
var b = 50
var result = a > b ? a : b
print(result)
- 階段性小結
-
Swift
中的三目
運算保持了和 OC 一致的風格
-
可選項
演練 1
let url = NSURL(string: "http://www.520it.com/")
if url != nil {
NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, _, _) -> Void in
print(NSString(data: data!, encoding: NSUTF8StringEncoding))
}).resume()
}
-
階段性小結
- 在
Swift
中,不是所有的對象實例化方法都會返回值,在實際開發中需要注意實例化函數的返回類型,例如:
- 在
convenience init?(string URLString: String)
* 如果有 `?` 表示改方法有可能無法實例化到正確的對象
* 這種函數返回的對象,被稱為 `可選項`,即有可能有值,也有可能沒有值
* 實際開發時,需要針對這種對象加以判斷,并且在分支內部使用 `!`,指明改對象確實是存在的
* 相比在 `OC` 的開發,尤其在日常練習時,會給定一個能夠運行的值,而在實際運行時,一旦條件不滿足,會直接閃退,這樣用戶體驗會非常不好
> `Swift` 的設計者考慮到因為對類型的強制要求,會讓代碼很難看,因此提供了一個變通的解決方案
### 演練 2
```swift
if let url = NSURL(string: "http://520it.com") {
NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, _, _) -> Void in
print(NSString(data: data!, encoding: NSUTF8StringEncoding))
}).resume()
}
-
階段性小結
- 使用
if let 常量 = 可選構造函數
的方式能夠確保分支內部常量一定是有值的 - 并且在分支內部不再需要使用
!
- 這是
Swift
代碼中的一個非常重要的使用技巧
- 使用
-
提示
- 盡管
Swift
提供了類型校驗的手段,但是要寫出優雅
的 Swift 代碼,還是需要多加練習的,否則一不小心就會出現分支嵌套層次很深的代碼 - 有關
?
和!
的選擇,可以借助 Xcode 的輔助工具,但是強烈建議每次遇到提示時,要多加思考,反復揣摩
- 盡管
演練3
var name: String?
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
name = "lnj"
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
let l = 10
print(l + (name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) ?? 0))
- 階段性小結
-
??
是一個非常有用的操作符,能夠快速對nil
進行判斷 - 如果對象是
nil
,則使用??
后面的值代替前面的nil
值參與計算 - 在使用
??
時,整個部分需要使用()
包裝 - 這一技巧在
UITableView
的數據源方法中尤為重要
-
循環
OC風格的 for
// 傳統寫法
for var i = 0; i < 10; i++ {
print(i)
}
Swift風格的 for
// 遍歷 0 ~ <10
for i in 0..<10 {
print(i)
}
print("---")
// 遍歷 0 ~ 10
for i in 0...10 {
print(i)
}
- 階段性小結
-
Swift
中使用in
關鍵字標示循環的范圍 -
0..<10
表示從0到9 -
0...10
表示從0到10 - 注意之間不能出現空格
-
特殊寫法
for _ in 0...10 {
print("hello")
}
- 階段性小結
- 如果不關心循環本身的索引,可以使用
_
忽略
- 如果不關心循環本身的索引,可以使用