1.必須賦值的變量,或普通變量
var month:Int
println("month:\(month)")
上面這2句代碼會提示報錯,因為沒有賦值
2.再看看如下寫法
var month:Int?
println("month:\(month)")
打印的值為:month:nil
即java里面的null
3.再看看這個代碼
var month:Int!
println("month:\(month)")
輸出的和2一樣
4.總結1
問號和感嘆號都可以標識變量為可選變量或可空變量
5.問號和感嘆號的區別
var year:Int = 2014;
var month:Int?
println("month:\(month)")
year = month
輸出:month:nil
fatal error: Can't unwrap Optional.None
.....
var year:Int = 2014;
var month:Int? = 12;
println("month:\(month)")
year = month!
上面這個代碼就可以正常運行
如果把感嘆號換成問號就會提示錯誤
6.總結2
!可取可選變量的非空值,?就不可以這樣
7.可選變量可以當條件來使用(非空為真,空為假),而普通變量不行
var a:Int?
if a {
println("1");
} else {
println("2");
}
8.可選變量的類型轉換
代碼1:
var a:String? = "22"
println("a:\(a?.toInt())");
代碼2:
var a:String?
println("a:\(a!.toInt())");
代碼3:
var a:String?
println("a:\(a?.toInt())");
解釋:?有點類似java里面的 a == false ? "false" :"true" 。 代碼1能正常運行,代碼2是強制拿a的值去轉換,而代碼3里就不會了,而是判斷下為不為空,如果為空就不執行轉換。
有人直接把?表示為判斷解析,!表示為強制解析
