在 swift 中,可選型別用來處理值可能缺失的情況,表示下面兩種情況:
在 swift 中宣告變數時,使用?
或!
來表示宣告的變數是可選型別。
let name:string?
var age:int!
此時,變數name
和age
預設都是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 方法一般...