簡介
通過構(gòu)造函數(shù)為Int類型的變量count賦一個初始值
var count: Int = Int("42")
此時count的初始值就是42
var numb: Int = Int("hello")
此時通過構(gòu)造函數(shù)無法構(gòu)造出一個Int類型的數(shù)字厨疙,程序會報錯葡兑,number在這時是無值的粪滤。OC中程序會在這種情況下為number默認賦值為0弛随,這樣并不能嚴格區(qū)分出這個變量是否有值单旁。
-
Optional type
Optional type是一個有兩個case的枚舉,Optional.none相當于nil蔫浆,Optional.some(Wrapped) 存儲著一個包裝過的值
在swift中我們可以定義Optional類型的實例敞嗡,Optional實例的值的類型即為Optional type。這樣就可以嚴格區(qū)分出這個變量是否有值榛瓮,也可以初始化一個無值的實例切蟋。
使用
兩種使用Optional type的方法
let shortForm: Int? = Int("42") //在類型的后面加上?
let longForm: Optional<Int> = Int("42")
解包裝
optional類型實例存儲的內(nèi)容是被包裝起來的,我們需要解開包裝榆芦,才能讀取它的內(nèi)容柄粹。
- Optional Binding:如果要按條件將包裝值賦給新的實例,可以使用if let, guard let,或switch解包
var str: String?
if let strName = str {
print("test" + strName)
} else {
print("沒有值")
}
// Prints "沒有值"
這個過程相當于:1.判斷optional變量(常量)是否有值 2.如果有值匆绣,使用!取值
- Optional Chaining:如果要安全的訪問Optional類型實例的屬性或方法驻右,可以使用操作運算符(postfix)
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
if let isPNG = imagePaths["star"]?.hasSuffix(".png") {
print("The star image is in PNG format")
}
- Using the Nil-Coalescing Operator(設置默認值):使用?? 如果Optional實例為nil,則為其設置一個默認值
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"
??還可以同時為多個Optional實例設置默認值
let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"
- Unconditional Unwrapping:當你確定某個Optional實例擁有一個確定的值時崎淳,可以使用!強制解開包裝讀取內(nèi)容堪夭。
let number2 = Int("42")!
print(number2)
// Prints "42"
當optional常量/變量沒有任何東西時,讀取到的即為nil,這是有一定風險的森爽。
這里也可以使用操作運算符(postfix)
let isPNG = imagePaths["star"]!.hasSuffix(".png")
print(isPNG)
// Prints "true"
- Implicitly Unwrapped Optioal(自動解包):定義Optional變量或常量時恨豁,在類型后加上!(不再是加?),則在使用時可以直接取值(不用再加!強制解開包裝讀取內(nèi)容)爬迟。如果我們可以確定一旦變量或者常量被創(chuàng)建并初始化后橘蜜,一直都會有值,那么就可以使用隱式拆包方式獲取值付呕。
var str2: String! = "str2"
//不需要使用!计福,直接解包
let str2Name :String = str2
如果嘗試訪問的自動解包可選值不包含值,會觸發(fā)運行時錯誤徽职。我們依然可以想使用正常的Optional一樣象颖,使用if或者while 判斷自動解包可選值是否包含值
var str2: String! = nil
//不需要使用!,直接解包
if (str2 != nil) {
print(str2)
}
注意事項
- 在swift中非optional類型常量和變量是不能設置為nil的姆钉,這與OC用的nil不同说订。
- swift中的nil不同與OC中的nil,在OC中潮瓶,nil表示不存在的對象陶冷。在Swit中,nil不是指針筋讨,只是表示某種類型的值不存在埃叭,
- optional可以設置任何類型值為nil,不僅僅是對象類型悉罕。如果在代碼中不確定這個變量或者常量是否有值赤屋,那么就聲明為optional。
以上是自己在學習Optional過程中的記錄和總結(jié)壁袄,如有不足类早,還望指教。
參考: