Swift中的感嘆號( ! )與問號( ? )之謎


基本了解

在Swift代碼會經常看到定義屬性或方法參數時類型后面會緊跟一個感嘆號( ! )或問號( ? ), 剛開始接觸Swift的童鞋就可能不太明白之代表什么意思,一頭霧水,開始凌亂了。
本文將帶你了解感嘆號( ! )與問號( ? )之謎,首先問號( ? )是可選類型,是用來處理值可能缺失的情況,也就是沒有值的情況(也就是OC中NULL); 感嘆號( ! )就是與之相反的, 就是一定有值(非可選類型),不存在空值的情況(OC中NULL)。
下面根據不同使用場景來進一步了解感嘆號( ! )與問號( ? )之謎

各個場景中的嘆號( ! )與問號( ? )

類的屬性

class MyClass {
    
    var value: String!
    var optionalValue: String? // defaulit is nil, 所有定義為可選類型的,可選值都是nil, 和數據類型沒有關系。
 }

MyClass定義了2個屬性:valueoptionalValue,其中optionalValue為可選類型;這表示value在使用之前一定是賦了值的(一定有值),optionalValue則有可能值缺失。下面先來看看幾個代碼片段來深入了解感嘆號( ! )與問號( ? )之謎

1. 下面代碼,在運行時初始化一個MyClass實例會發生什么呢?

class MyClass {
    
    var value: String!
    var optionalValue: String?
    
    init() {
        
        let _ = value.count
        let _ = optionalValue?.count // 可選解析
    }
}

程序會崩潰,報以下錯誤
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

value是非可選類型,必須要有值,從代碼中看出value從賦值過。另外構造函數里的問號( ? )是指可選解析(弱解析),並不是指可選類型,這里要注意了

2. 下面代碼,在運行時初始化一個MyClass實例會發生什么呢?

class MyClass {
    
    var value: String!
    var optionalValue: String?
    
    init() {
        
        value = "this is string value."

        let _ = value.count
        let _ = optionalValue!.count // 強解析
    }
}

程序會崩潰,和代碼片段1報一樣的錯誤
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

大家肯定奇怪了明明value已經賦值了,為什么還會崩潰,問題出在optionalValue屬性,不知道大家注意了沒有,此代碼的構造函數中optionalValue后面是感嘆號( ! ),而代碼片段1的構造函數中optionalValue后面是問號( ? )。這里的感嘆號( ! )是指強解析,你也可以理解為強制取值,但是optionalValue至定義后從未賦值過,也就是沒有值(特別注意:可選值不是值),自然也就和代碼片段1報一樣的錯

未完待續 ,我的個人博客 [ 雲博客BLOG ]最先更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM