1. 強(qiáng)解包和?? 運(yùn)算符來解決可選值的判斷
let url = URL(string: "http://www.baidu.com")
// 通過快速推倒(option + 鼠標(biāo)左鍵): 可以知道, url為 let url: URL? 可選值類型, 因?yàn)檫@個(gè)url可能初始化成功, 但是也可能失敗.
// 創(chuàng)建請(qǐng)求 -- 這里創(chuàng)建請(qǐng)求的參數(shù), 為一個(gè)必選值, 而url是一個(gè)可選值, 所以就會(huì)報(bào)錯(cuò), 這里談兩種簡(jiǎn)單的解決方式(在之前可選值那課有明確的解釋):
// 1. 強(qiáng)行解包 -- 格式就是在常量或者變量后面加一個(gè)嘆號(hào). 作用就是保證參數(shù)不為nil, 一定有值, 你就放心使用吧! 但是,一旦你保證錯(cuò)誤, 程序也會(huì)崩潰(例如: 將上面的網(wǎng)址字符串后面亂寫點(diǎn)字母, 就會(huì)實(shí)例化不成功, 就算這里強(qiáng)行解包了, 走到下一步也會(huì)造成崩潰).
let request = URLRequest(url: url!)
// 2. ?? 運(yùn)算符 -- 格式: 可選值 ?? 程序員自己設(shè)定的值. 作用就是一旦可選值為nil的時(shí)候, 就會(huì)將該可選值賦值為程序員設(shè)定的默認(rèn)值, 這樣就不會(huì)造成了程序崩潰.
let url2 = url ?? URL(string: "http://www.baidu.com")!
let request = URLRequest(url: url2)
2.if - let/var
- 使用if - let 判斷可選值是否為nil
- 定義一個(gè) 常量/變量 記錄可選值不為nil的結(jié)果 在if - let作用域中 直接使用定義好的常量即可.
2.1 判斷單個(gè)可選值
func demo(){
// if - let/var 判斷單個(gè)可選值
let url = URL(string: "http://www.baidu.com")
if let u = url {
// 使用新的常量 u 來記錄 可選值url不為nil的情況, 當(dāng) u 存在, 也就證明url有值, 也就進(jìn)入到if - let作用域
let request = URLRequest(url: u)
print(request)
}
// 不僅判斷url 有值, 且包含"baidu"
if let u = url, u.absoluteString.contains("baidu"){
// 這里的逗號(hào)分隔判斷, 相當(dāng)于OC 的 &&, 必須同時(shí)滿足條件, 才能進(jìn)入到if - let作用域
let request = URLRequest(url: u)
print(request)
}
}
2.1 判斷多個(gè)可選值
func demo(){
// if - let/var 判斷多個(gè)可選值
let name: String? = "老王"
let age: Int? = 18
if var n = name, let a = age{
// 判斷多個(gè)可選值的時(shí)候也是使用逗號(hào)分隔開即可
// 在作用域內(nèi)部需要修改名字的時(shí)候, 就需要將let -> var, 不對(duì)age進(jìn)行修改, 就還是用let
n = "老李"
print(n, a)
}
}
3. guard (守護(hù)) - let/var
- guard 定義一個(gè)常量有值, 如果沒有值 也就是為nil 直接return.
- 如果有值 不為nil 代碼繼續(xù)向下進(jìn)行.
- 判斷方式與if-let相反.
- Swift2.0提出的,少了一層代碼嵌套.
3.1 guard 判斷單個(gè)可選值
func demo(){
let url = URL(string: "http://www.baidu.com")
// 單個(gè)可選值判斷
// 定義一個(gè)常量 u 不為nil, 否則 進(jìn)入 guard 作用域
guard let u = url else {
// 為nil, 直接return
return
}
// 不為nil, 之后所有用到url的操作, 都使用記錄的b常量 u 代替
let request = URLRequest(url: u)
print(request)
}
3.2 guard 判斷多個(gè)可選值
更新
: 判斷多個(gè)可選值的逗號(hào)相當(dāng)于oc中的 || (或者), 也就是只要有一個(gè)值為nil, 就會(huì)進(jìn)入guard (守護(hù)) - let/var作用域return掉.
func demo(){
let name: String? = "老王"
let age: Int? = 18
#更新`: 這里的逗號(hào)相當(dāng)于oc中的 || (或者), 也就是只要有一個(gè)值為nil, 就會(huì)進(jìn)入guard (守護(hù)) - let/var作用域return掉.
guard let n = name, let a = age else {
return
}
print(n, a)
}
最后, 以上內(nèi)容如有問題, 歡迎指正, 或者有其他的問題, 也歡迎留言討論~