?!

一般狀況

一般語言會將未賦值的變數預設為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

results matching ""

    No results matching ""