Swift- 可選類型,隱式解析可選類型

可選類型

聲明變量或常量的時候,代表可以有值,也可以無值。在類型標注后面,用?表示當其沒有值時可以賦值nil

如果一個變量和常量是非可選類型的話,不能賦值為nil

let assumedString: String? = nil //可以被賦值為nil

let implicitString: String = nil //不可以

如果要判斷一個非可選類型的變量或常量是否為空,不能這樣判斷? xxx != nil

let forcedString:String = possibleString!

let implicityString:String = "hello"

if implicitString != nil { //不能這樣判斷,會報錯

}

nil 不是一個指向不存在對象的指針,它是一個確定的值,如果聲明了一個可選類型的變量(注意沒有常量)而不賦值,Swift會給它默認是nil

var A:String? // 默認是nil

var B:String? //只是聲明了,swift沒有給它默認賦值,不能對它進行操作

總之一個變量或常量有可能是nil,就聲明為可選類型比較安全,因為非可選類型不能為nil

我要親你了哦

隱式解析可選類型

可選類型代表著一個變量或常量可能為nil,但是非可選類型不能賦值為nil

那么,問題來了!

賦值的時候怎么確定一個可選類型是有值的呢?

比如像這樣

var dog :String? = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值

let cat:String = dog? //cat說,滾,我怎么知道你是不是nil,你這個可選類型!

你看看,不能怨cat啊,dog如果是nil的話,cat是非可選類型的不能為nil就會報錯啊

所以dog就在后面加了個尾巴!代表我有值!

var dog :String? = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值

let cat:String = dog!? //cat說,嗯,我已經拿到啦,么么噠!

這個!是多么的重要啊

但是反而想,可選類型每次給別人賦值都要在后面加個!是多么的費事

如果可選類型給可選類型賦值不用操心,因為被賦值的是個可選類型可以被賦值為nil,所以不用加 !也行。

如下圖:

var dog :String? = "wangcai" //dog變量想要給一個可選類型的cat變量賦值

let cat:String? = dog? //cat說,都是可以被賦值為nil的,所以不用擔心被你坑

如果是接下來的情況就很費心了

var dog :String! = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值

let cat:String = dog!? //cat說,嗯,我已經拿到啦,么么噠!

let tiger:String = dog! //hello,我是旺財~

let fish:String = dog!? //我是旺財~

let bird:String = dog!? //旺財。。。

let sheep:String = dog! //為什么每次都得驗證一遍

let mouse:String = dog! //心好累

其實這個時候dog變量只要聲明一下自己是隱式解析可選類型就不用費心啦,只要在第一次的時候賦值不為nil就好

var dog :String! = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值

let cat:String = dog? //cat說,嗯,我已經拿到啦,么么噠!

let tiger:String = dog //ok

let fish:String = dog? //ok

let bird:String = dog? //ok

let sheep:String = dog //ok

let mouse:String = dog //ok

如圖,不需要每次都加‘!’一步到位?。。?!

所以隱式解析可選類型就相當于默默地在每一個可選類型的后面加!

隱式解析可選類型 = 默默地+給可選類型+加!號

以下是后來修改內容。。。。

知識擴展,剛剛上文說了

非可選類型都不能賦值為nil,那么隱式解析可選類型能不能賦值為nil呢

。

。

。

答案是可以

隱式解析可選類型可以像可選類型一樣被賦值為nil,這就體現出來隱式可選類型的優點即可用被賦值為nil,也可以不用每次展開訪問值。

具體隱式解析可選類型的用法是在類中做屬性解決循環引用問題。

轉載自<民謠程序員?>


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Swift 是一門開發 iOS, macOS, watchOS 和 tvOS 應用的新語言。然而,如果你有 C 或...
    XLsn0w閱讀 934評論 2 1
  • 可選類型 聲明變量或常量的時候,代表可以有值,也可以無值。在類型標注后面,用?表示當其沒有值時可以賦值nil 如果...
    春寒夏末秋閱讀 436評論 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,896評論 1 10
  • 關于 Swift 重要這個文檔所包含的準備信息, 是關于開發的 API 和技術的。這個信息可能會改變, 根據這個文...
    無灃閱讀 4,379評論 1 27
  • 孰云一葉知秋, 暑君安肯罷休? 此去清泠尚遠, 歸來兀自悠悠。
    太平書院閱讀 229評論 0 0