最近學(xué)習(xí)Swift,也在Playground上敲了些代碼刷后,雖然說Swift類似于Java,可從Java轉(zhuǎn)過來后我還是習(xí)慣地判空渊抄,像下面這個簡單的判斷:
String name = "sunfusheng";
if (name != null) {
// balabala...
}
但是在Swift中卻不行惠险,因為什么呢?原因在于Swift是強類型語言抒线,注重代碼的健壯與安全。那我還想判空渣慕,怎么解嘶炭?學(xué)到Swift的可選型問題迎刃而解抱慌。
可選型(Optional)
public enum Optional<T> {
case None
case Some(T)
}
可以看出可選型是個泛型,而Optional又是個枚舉 enum眨猎,Optional可以是 None抑进,也可以是Some(T)。
聲明可選型
顯式聲明
"?" 是 Optional<T> 的簡寫形式睡陪。
var name:Optional<String> = "sunfusheng"
var blog:String? = "sunfusheng.com"
// 現(xiàn)在就可以判斷啦
if name != nil {
print(name)
}
print(blog)
// 輸出
Optional("sunfusheng")
Optional("sunfusheng.com")
隱式聲明
"!" 是 ImplicitlyUnwrappedOptional<T> 的簡寫形式寺渗。
var name1:ImplicitlyUnwrappedOptional<String> = "sunfusheng"
var blog1:String! = "sunfusheng.com"
print(name1)
print(blog1)
// 輸出
sunfusheng
sunfusheng.com
可選型解包
Swift 中 String 和 Optional<String> 不是一個類型的,因為 Swift 是強類型語言兰迫,String 類型 和 Optional<String> 類型數(shù)據(jù)拼接肯定報錯的信殊,所以我們需要解包后使用。反過來說汁果,Java 是弱類型語言涡拘,隨便加,隨便拼接据德。
強制解包
// 顯式聲明的可選型變量后加 "!" 強制解包
var name:String? = "sunfusheng"
"My name is " + name!
// 不建議使用強制解包鳄乏,下面就會報錯
name = nil
"My name is " + name!
// 隱式聲明的可選型不需要解包,同樣可能因為 nil 報錯
var blog:String! = "sunfusheng.com"
// blog = nil
"My blog is " + blog
if let 解包可選型
// 可以使用相同的變量名解包
if let errorCode = errorCode {
print(errorCode)
}
// if let 可以同時解包多個變量棘利,同樣可以使用控制轉(zhuǎn)移的條件
if let errorCode = errorCode, errorMessage = errorMessage where errorCode == "404" {
print("Page not found")
} else {
print("No error")
}
可選鏈 (Optional Chaining)
使用可選鏈 (Optional Chaining) 的方式來調(diào)用可能為空(nil)的方法橱野,比如下面的代碼
// 把我的名字全變成大寫字母
var name:String? = "sunfusheng"
if let name = name {
print(name.uppercaseString)
}
// 輸出
SUNFUSHENG
// 更優(yōu)雅地使用可選鏈實現(xiàn)
print(name?.uppercaseString)
// 輸出
SUNFUSHENG
// 如果 name = nil 就不會繼續(xù)執(zhí)行 uppercaseString
name = nil
print(name?.uppercaseString)
// 輸出
nil
當然也可以使用強制解包方式使用可選鏈,當然不建議使用善玫,除非你確保它不為 nil
print(name!.uppercaseString)
// 輸出
SUNFUSHENG
// 編譯不過水援,報錯
name = nil
print(name!.uppercaseString)
Swift 可選型的強大之處可見一斑,以后的開發(fā)必然會經(jīng)常用到的蝌焚。
Swift 學(xué)習(xí)筆記將持續(xù)更新裹唆,歡迎關(guān)注我的公眾號,大家加油只洒!