?!
一般狀況
一般語言會將未賦值的變數預設為Null,但 Swift 中的變數不會有預設值(nil)。
var name: String
print(name)
執行會報錯而不是印出 nil
使用?宣告
若想要像其它程式那樣使用的話,就必須在宣告變數的時候,類型後方加入?
var name: String?
注意:此時類型非真正的 String,而是Optional包裝起來的String
取值
經過 Optional 包裝的類型,未賦值時會回傳 nil;賦值後會回傳 Optional(數值)
var name: String?
print(name)
印出 nil (不會報錯)
var name: String?
name = "ABC"
print(name)
印出 Optional("ABC")
所以使用?號宣告的變數,雖然判斷時會使用實際的數值判斷,要取得實際的數值時或操作實際物件時,就得經過拆包的步驟,下面列出三種方式。
方法1:!拆包
在變數後方加入驚嘆號!代表強制拆包,告訴他裡面一定有值了,直接拿出數值吧!
var name: String?
name = "ABC"
print(name!)
印出 "ABC"
但這也代表:如果裡面沒數值的話,就會報錯。(如下)
var name: String?
print(name!)
出錯
方法2:提供預設值
使用 ?? 在後方提供如果未賦值的預設參數,就可以避免未賦值的報錯;有值也會直接取真正的值:
var name: String?
print(name ?? "CDE")
印出 "CDE"
var name: String?
name = "ABC"
print(name ?? "CDE")
印出 "ABC"
方法3:Optional Binding
用 if 設定一個程式段落,限定只在 Optional 變數不為 nil 時執行。
var name: String?
name = "ABC"
if let n = name {
print(n)
}
印出 "ABC"
參考網站
https://dotblogs.com.tw/lapland/2015/08/30/153256 https://hugolu.gitbooks.io/learn-swift/content/Basic/Optional.html