前提
使用可選項的時候毫目,對應的一般要使用!來強行解包蔬啡,大多數(shù)情況下使用!是有風險的,一不小心就會崩镀虐,比如:
func demo(x: Int?, y: Int?){
print(x! + y!)
}
然后調(diào)用的時候是這樣的demo(x:10,y:100)
箱蟆,這樣一般沒有錯誤的,但是當外面?zhèn)鞯膮?shù)是nil
的話刮便,那么就會報錯空猜,自己可以試試。所以有些人就用if
來解決問題恨旱,代碼如下:
if x != nil && y != nil {
print(x! + y!)
}else{
print("x或者y為nil")
}
這么寫不會出錯辈毯,但是如果直接使用if
,一不小心會讓代碼很丑陋搜贤。有興趣的可以去王巍的書中找找看谆沃,有用if
的這么判斷,你只會覺得很蛋疼仪芒。
接著來用第二種方法來做判斷:
func demo1(x: Int?, y: Int?) {
/**
??是一個簡單的三目
- 如果有值唁影,使用值
- 如果沒有值,用??后面的值替代
*/
print((x ?? 0) + (y ?? 0))
let name:String? = nil//= "老王"
print((name ?? "") + "你好")
//'??'操作符號的優(yōu)先級低掂名,在使用的時候据沈,最好加上()包一下
print(name ?? "" + "你好")//如果上面的string = 老王,那么這兒打印的就是老王饺蔑,這個是個三目锌介,name為空的話打印`+你好`。
}
這種方法寫出來就好看多了膀钠,也是很常用的掏湾。
然后使用第三種方法:if let / var
func demo2() {
let oName: String? = "老王"
let oAge: Int? = 10
if oName != nil && oAge != nil {
print(oName! + String(oAge!))
}
//if let連用,判斷對象的值是否為nil肿嘲,{}內(nèi)一定有值融击,可以直接使用,不需要解包
//if var連用雳窟,{}可以對值直接進行修改
if var name = oName, let age = oAge
{
name = "老李"
//進入分支之后尊浪,name和age一定有值匣屡,不需要解包
//name和age的作用域僅在{}中
print(name + String(age))
}else{
print("name 或 age 為 nil")
}
}
緊接著來使用第四種方法:guard
// guard let 和if剛好相反
func demo3(){
let oName: String? = "老王"
let oAge: Int? = 10
//guard let守護一定有值,如果沒有直接返回
guard let name = oName,let age = oAge else {
print("姓名或者年齡為nil")
return
}
//代碼行至此拇涤,name和age一定有值
//通常哦按段是否有值之后捣作,會做具體的邏輯實現(xiàn),通常代碼多
//如果用if let憑空多了一層分支,guard降低分支層次的辦法
//guard是swift2.0推出的
print (name + String(age))
}
最后說說guard let & if let的技巧:
func demo4(name: String?,age:Int?){
//非空的name和age僅在{}內(nèi)有效
if let name = name,let age = age {
print (name + String(age))
print("--------------")
}
//guard let & if let的技巧
//使用同名的變量接收值,在后續(xù)使用的都是非空值鹅士,不需要解包
//好處券躁,可以避免起名字的煩惱
guard let name = name, let age = age else {
print("姓名或者年齡為nil")
return
}
print (name + String(age))
// let oName: String? = "老王"
// let oAge: Int? = 10
}
總結(jié)
在使用可選項的時候,往往需要解包掉盅,和文中舉的例子一樣也拜,如果你傳個nil
的時候就會崩潰,所以需要判斷可選項的值趾痘,總共介紹了四種方法慢哈,推薦使用2,3永票,4三種方法卵贱!