小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

Swift 學習之二十一:?和 !(詳解)

 oskycar 2014-10-12

Swift語言使用var定義變量,但和別的語言不同,Swift里不會自動給變量賦初始值,

也就是說變量不會有默認值,所以要求使用變量之前必須要對其初始化

。如果在使用變量之前不進行初始化就會報錯:

  1. var stringValue : String   
  2. //error: variable 'stringValue' used before being initialized  
  3. //let hashValue = stringValue.hashValue  
  4. //                            ^  
  5. let hashValue = stringValue.hashValue  

出錯的原因就是在使用stringValue這個變量之前,沒有初始化這個變量,也就是這個變量根本就沒有得到內(nèi)存,

這時就會出錯。

那么我們可以使用optional類型,后面跟一個?就是了。

  1. // 這就是optional, strValue自動得到默認值:nil   
  2. // 這個nil跟Objective-C中的nil不同,不是指針,而是表示值不存在。  
  3. var strValue: String?   
  4.   
  5. // 判斷optional是否有值  
  6. if strValue {  
  7.  // do what you need to do here  
  8. }  


文檔中有提到說,在使用Optional值的時候需要在具體的操作,比如調(diào)用方法、屬性、下標索引等前面需要加上一個?,如果是nil值(不存在值),也就是Optional.None,會跳過后面的操作不執(zhí)行,如果有值,就是Optional.Some可能就會拆包(unwrap),然后對拆包后的值執(zhí)行后面的操作,來保證執(zhí)行這個操作的安全性,比如Optional binding:

  1. // optional binding  
  2. // 如果strValue == nil, 那么結(jié)果就是nil,不會調(diào)用String的hasValue  
  3. // 如果strValue != nil, 就返回strValue對應的hashValue值并賦值給常量hashValue  
  4. if let hashValue = strValue?.hashValue {  
  5.   // do something if neccessary  
  6. }  

在寫協(xié)議(protocol)時,對于可選代理方法,也需要在調(diào)用時在函數(shù)名后跟著?,如:

  1. // @objc 是用于處理Swift與OC之間的轉(zhuǎn)換的,由于@optional是OC中的關(guān)鍵字,  
  2. // 所以在protocol之前需要添加上@objc。  
  3. @objc protocol HttpRequestDelegate {  
  4.   // @optional 說明這個代理方法是可選方法,  
  5.   // 那么在調(diào)用的時候,需要這樣調(diào)用:delegate?.requestFinished?(self, downloadData)  
  6.   // 其中delegate?是因為delegate也是optional的  
  7.   @optional func requestFinished(request: HttpRequest!, downloadData: NSMutableData!)  
  8.     
  9.   // other funcs ...  
  10. }  
  11.   
  12. var delegate: HttpRequestDelegate?  
  13. var downloadData = NSMutableData()  
  14. delegate.requestFinished(self, downloadData)  


當然我們也可以使用!來強制拆包,這是我們在保證有值的情況下才會這么用:

  1. var strValue: String?  
  2. strValue = "1234"  
  3.   
  4. let integer = strValue!.toInt()  
  5. // 更安全的寫法是  
  6. if strValue {  
  7.   let integer = strValue!.toInt()  
  8. }  


隱式強拆包類型:

使用!來聲明變量,會成為隱式強拆包可選類型,這表示這個類型永遠不會出現(xiàn)nil的情況,但一旦出來,

在調(diào)用時就會崩潰。

  1. // Implicitly Unwrapped Optionals  
  2. // 使用這種方式聲明的話,在調(diào)用時不需要使用?或!來說明。  
  3. var myLabel: UILabel!   
  4.   
  5. myLabel = UILabel(frame: CGRectMake(10, 100, 300, 10))  
  6. myLabel.text = "label"  


總結(jié):

通常在什么情況下才會使用optional類型呢?

(1)當我們需要聲明這樣一個變量,變量在設(shè)計初始化函數(shù)中沒有進行初始化時,就需要聲明這個變量為optional類型。因為變量在使用前必須先

        聲明,并且在設(shè)計初始化函數(shù)中進行初始化。比如我們在viewDidLoad函數(shù)中才進行初始化的控件(類成員),就需要聲明為optional且必須是var聲明,

       因為let聲明的常量只能是在初始化函數(shù)中進行初始化。

(2)當我們不知道是否會有值的時候,這個變量可以聲明為optional,比如代理,我們并沒有要求必須傳代理過來,那么就需要聲明為optional。

(3)作為函數(shù)參數(shù)時,如果這個參數(shù)可以沒有值,那么就使用optional類型,比如傳代理的時候,通常就是可選的,可以設(shè)置為nil

......暫時只想到這些,任何人都可以繼續(xù)往下補充!




    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多