Swift 可選型別

2021-09-19 10:41:48 字數 1907 閱讀 7621

在 swift 中,可選型別用來處理值可能缺失的情況,表示下面兩種情況:

在 swift 中宣告變數時,使用?!來表示宣告的變數是可選型別。

let name:string?

var age:int!

此時,變數nameage預設都是nil,表示空。

?!的區別在於使用前者宣告的變數所包含的值時,需要在變數後新增!符號來解析其所包含的值,而後者是隱式解析,不需要再新增!符號。

如下:

name = "john"

let tmpname:string = name!

age = "18"

let tmp:int = age

當然,使用隱式解析宣告的變數時,即使新增了!符號來強制解析其包含的值也不會報錯。但是,需要注意的是,如果可選變數中並不包含值而進行了解析,即便是隱式的,也會報錯,因為nil不能用於非可選的常量和變數。

除非確定變數賦值後便不可能為nil,否則不宜使用!符號宣告可選變數。而在使用可選變數時,如果不能確定可選變數中的確包含值,那麼不宜使用!符號進行解析。

在使用可選型別時,如果不確定它是否確實包含值,而又需要訪問其可能包含的值的屬性、方法或下標時,可以在可選值後新增乙個?符號,定義乙個可選鏈。不同於使用!符號進行強制展開,該可選鏈不會因為無值可展開而發生執行時錯誤。

並且,可選鏈呼叫的返回結果同樣是乙個可選值,即便真實的屬性或方法返回值並非可選型別,因為這些非可選型別會被包裝成可選型別,不過對於已經是可選型別的結果並不會再進行包裝。

如下面的例子:

class person: nsobject 

var apartment:apartment?

}class apartment

weak var tenant:person!

func changeadd(address:string) -> string?

}func test()

}

apartment類中,屬性tenant是隱式可選型別,但在test方法中,仍然可以在tenant後新增?來構成可選鏈,當然這裡也可以省去?,但是如果同時tenant沒有值時,程式便會報錯。

如下:

func test() 

}

而不省略?構成的可選鏈會檢查每乙個可選值的取值結果,如果有乙個可選值包含的值為nil,那麼便直接返回nil

將下面的**單獨成一行,便會發現,ishas是的結果是(bool?)nil,而從hasprefix方法的定義可知,其返回型別為bool,所以可以得知可選鏈中的每乙個結點的返回結果如果是非可選值,也會被包裝為可選值。

let ishas = person.apartment?.tenant.apartment?.changeadd(address: "shanghai")?.hasprefix("shang")
參考:

可選型別、

可選鏈、

mr_yinwei

Swift 可選型別

swift 可選型別 optionals 可選型別 強制解析 自動解析 可選繫結 1.可選型別 加入我們建立乙個變數,但是它有可能為空,這時候swift提供乙個符號 來表示這是乙個可能為空的變數 var thisstr string?看到這裡的if,沒錯,if或者for迴圈後面的內容不加 加了也沒錯...

swift可選隱式可選型別

可選型別 隱式可選型別 在swift中,可選魯迅個其實是乙個,列舉型別,裡面有none和some兩種型別。其實所謂的nil就是optional.none,非nil就是optional.some,然後會通過some t 包裝 wrap 原始值,這也是為什麼可選型別需要拆包的原因,也是playgroun...

Swift筆記 可選型別

c 和 objective c 中並沒有可選型別這個概念。最接近的是 objective c 中的乙個特性,乙個方法要不返回乙個物件要不返回nil,nil表示 缺少乙個合法的物件 然而,這只對物件起作用 對於結構體,基本的 c 型別或者列舉型別不起作用。對於這些型別,objective c 方法一般...