亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swift之?和!

2019-11-14 20:22:51
字體:
來源:轉載
供稿:網友

              Swift之 ? 和 !

         轉載于: http://joeyio.com/ios/2014/06/04/swift---/

 

Swift語言使用var定義變量,但和別的語言不同,Swift里不會自動給變量賦初始值,也就是說變量不會有默認值,所以要求使用變量之前必須要對其初始化。如果在使用變量之前不進行初始化就會報錯:

var stringValue : String //error: variable 'stringValue' used before being initialized//let hashValue = stringValue.hashValue//                            ^let hashValue = stringValue.hashValue

上面了解到的是普通值,接下來Optional值要上場了。經喵神提醒,Optional其實是個enum,里面有NoneSome兩種類型。其實所謂的nil就是Optional.None, 非nil就是Optional.Some, 然后會通過Some(T)包裝(wrap)原始值,這也是為什么在使用Optional的時候要拆包(從enum里取出來原始值)的原因, 也是PlayGround會把Optional值顯示為類似{Some "hello world"}的原因,這里是enum Optional的定義:

enum Optional<T> : LogicValue, Reflectable {    case None    case Some(T)    init()    init(_ some: T)    /// Allow use in a Boolean context.    func getLogicValue() -> Bool    /// Haskell's fmap, which was mis-named    func map<U>(f: (T) -> U) -> U?    func getMirror() -> Mirror}

聲明為Optional只需要在類型后面緊跟一個?即可。如:

var strValue: String?   //?相當于下面這種寫法的語法糖var strValue: Optional<String>  

 

上面這個Optional的聲明,意思不是”我聲明了一個Optional的String值”, 而是”我聲明了一個Optional類型值,它可能包含一個String值,也可能什么都不包含”,也就是說實際上我們聲明的是Optional類型,而 不是聲明了一個String類型,這一點需要銘記在心。

建議再讀一遍上段文字。

一旦聲明為Optional的,如果不顯式的賦值就會有個默認值nil。判斷一個Optional的值是否有值,可以用if來判斷:

if strValue {    //do sth with strValue}

 

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

let hashValue = strValue?.hashValue 

strValue是Optional的字符串,如果strValue是nil,則hashValue也為nil,如果strValue不為nil,hashValue就是strValue字符串的哈希值(其實也是用Optional wrap后的值)

另外,?還可以用在安全地調用PRotocol類型方法上,比如:

    @objc protocol Downloadable {    @optional func download(toPath: String) -> Bool;}@objc class Content: Downloadable {    //download method not be implemented}var delegate: Downloadable = Downloadable()delegate.download?("some path")

因為上面的delegate是Downloadable類型的,它的download方法是optional,所以它的具體實現有沒有download方法是不確定的。Swift提供了一種在參數括號前加上一個?的方式來安全地調用protocol的optional方法。

 

另外如果你需要像下面這樣向下轉型(Downcast),可能會用到 as?

if let dataSource = object as? UITableViewDataSource {    let rowsInFirstSection  = dataSource.tableView(tableView, numberOfRowsInSection: 0)}

 

到這里我們看到了?的幾種使用場景:
1.聲明Optional值變量
2.用在對Optional值操作中,用來判斷是否能響應后面的操作
3.用于安全調用protocol的optional方法
4.使用 as? 向下轉型(Downcast)

另外,對于Optional值,不能直接進行操作,否則會報錯:

//error: 'String?' does not have a member named 'hashValue'//let hashValue = strValue.hashValue//                ^        ~~~~~~~~~let hashValue = strValue.hashValue

 

上面提到Optional值需要拆包(unwrap)后才能得到原來值,然后才能對其操作,那怎么來拆包呢?拆包提到了幾種方法,一種是Optional Binding, 比如:

if let str = strValue {    let hashValue = str.hashValue}

 

還有一種是在具體的操作前添加!符號,好吧,這又是什么詭異的語法?!

直接上例子,strValue是Optional的String:

let hashValue = strValue!.hashValue 

這里的!表示“我確定這里的的strValue一定是非nil的,盡情調用吧” ,比如這種情況:

if strValue {    let hashValue = strValue!.hashValue}

{}里的strValue一定是非nil的,所以就能直接加上!,強制拆包(unwrap)并執行后面的操作。 當然如果不加判斷,strValue不小心為nil的話,就會出錯,crash掉。

 

考慮下這一種情況,我們有一個自定義的MyViewController類,類中有一個屬性是myLabel,myLabel是在viewDidLoad中進行初始化。因為是在viewDidLoad中初始化,所以不能直接聲明為普通值:var myLabel : UILabel,因為非Optional的變量必須在聲明時或者構造器中進行初始化,但我們是想在viewDidLoad中初始化,所以就只能聲明為Optional:var myLabel: UILabel?, 雖然我們確定在viewDidLoad中會初始化,并且在ViewController的生命周期內不會置為nil,但是在對myLabel操作時,每次依然要加上!來強制拆包(在讀取值的時候,也可以用?,謝謝ipresent在回復中提醒),比如:

myLabel!.text = "text"myLabel!.frame = CGRectMake(0, 0, 10, 10)...

對于這種類型的值,我們可以直接這么聲明:var myLabel: UILabel!, 果然是高(hao)大(gui)上(yi)的語法!, 這種是特殊的Optional,稱為Implicitly Unwrapped Optionals, 直譯就是隱式拆包的Optional,就等于說你每次對這種類型的值操作時,都會自動在操作前補上一個!進行拆包,然后在執行后面的操作,當然如果該值是nil,也一樣會報錯crash掉。

var myLabel: UILabel!  //!相當于下面這種寫法的語法糖var myLabel: ImplicitlyUnwrappedOptional<UILabel>

那么!大概也有兩種使用場景
1.強制對Optional值進行拆包(unwrap)
2.聲明Implicitly Unwrapped Optionals值,一般用于類中的屬性

Swift是門新生的語言,我們有幸見證了它的誕生,激動之余也在佩服蘋果大刀闊斧的推出一個新的語言替代一個已經比較成熟語言的魄力,今天在知乎日報上看到一個回答是說Swift是一門玩具語言,正當想去吐槽,發現回答已經被刪除了。個人認為蘋果是很認真的推出Swift的,從Swift的各種細微的設計也能看的出來。

另外這兩個小符號就花費了我不少的時間來理解,可能依然會有錯誤和不妥之處,歡迎大家指正,本文旨在拋磚引玉。除此之外,Swift還有很多很棒的特性,WWDC 2014 會有四五個和Swift語言相關的Video,大家也可以去關注一下。

最后要感謝喵神的糾正了多處有問題的地方,thx, have fun!

REF

    1. The Swift Programming Language
    2. Understanding Optionals in Swift

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品福利视频| 欧美裸体视频网站| 成人黄色免费在线观看| 91久久精品国产91久久性色| 欧美最猛黑人xxxx黑人猛叫黄| 97久久超碰福利国产精品…| 欧美色另类天堂2015| 日韩在线视频中文字幕| 亚洲精品白浆高清久久久久久| 国产欧美va欧美va香蕉在线| 91精品国产沙发| 成人免费大片黄在线播放| 久久亚洲精品国产亚洲老地址| 国产精品极品美女粉嫩高清在线| 欧美高清视频在线| 欧美高清在线播放| 81精品国产乱码久久久久久| 亚洲精品久久久久久久久久久久久| 91爱爱小视频k| 亚洲精品国偷自产在线99热| 日韩在线视频国产| 91精品国产色综合久久不卡98| 精品久久久久久久久久久久久久| 亚洲一区免费网站| 日韩少妇与小伙激情| 精品久久久久久国产91| 中文字幕在线国产精品| 91极品女神在线| 精品亚洲夜色av98在线观看| 国产中文日韩欧美| 精品亚洲一区二区三区在线播放| 中文字幕精品久久久久| 久久久国产在线视频| 91精品在线看| 裸体女人亚洲精品一区| 欧美另类高清videos| 日本老师69xxx| 日韩av网站在线| 亚洲国产精品大全| 久久久久久久久久国产精品| 91精品国产综合久久香蕉最新版| 在线播放国产一区二区三区| 亚洲一区制服诱惑| 欧美午夜精品久久久久久人妖| 亚洲一区二区在线| 国产视频精品一区二区三区| 日韩精品在线观看网站| 亚洲精品电影在线观看| 狠狠躁天天躁日日躁欧美| 中文字幕免费国产精品| 国产在线精品成人一区二区三区| …久久精品99久久香蕉国产| 亚洲国产成人精品久久久国产成人一区| 国产国语videosex另类| 国产精品入口日韩视频大尺度| 91人人爽人人爽人人精88v| 亚洲欧美日韩精品久久奇米色影视| 狠狠色狠狠色综合日日小说| 亚洲视频视频在线| 成人观看高清在线观看免费| 5278欧美一区二区三区| 色视频www在线播放国产成人| 亚洲精品电影网| 国产精品一区二区av影院萌芽| 精品偷拍一区二区三区在线看| 2018中文字幕一区二区三区| 不卡av在线播放| 91福利视频在线观看| 色综合久久中文字幕综合网小说| 亚洲国产91色在线| 精品国产31久久久久久| 欧美激情在线播放| 91免费看片网站| 日韩欧美极品在线观看| 日韩精品高清视频| 久久久精品中文字幕| 成人福利在线视频| 91午夜理伦私人影院| 色www亚洲国产张柏芝| 日韩欧美有码在线| 亚洲精品美女在线观看播放| 中文字幕视频在线免费欧美日韩综合在线看| 久久久久久久电影一区| 色婷婷av一区二区三区在线观看| 色999日韩欧美国产| 久久久噜噜噜久久中文字免| 欧美激情亚洲国产| 亚洲一区二区三区在线视频| 日韩高清av在线| 亚洲欧美另类在线观看| 亚洲视频在线观看网站| 久久精品91久久久久久再现| 欧洲精品毛片网站| 国产精品中文字幕久久久| 亚洲男人天堂网| 亚洲人高潮女人毛茸茸| 欧美精品18videos性欧美| 久久青草精品视频免费观看| 精品久久久久久久久久久久久久| 视频直播国产精品| 97在线免费视频| 欧美三级xxx| 欧美性xxxxhd| 91久久精品一区| 精品亚洲夜色av98在线观看| 亚洲精品欧美一区二区三区| 久久视频在线直播| 性欧美长视频免费观看不卡| 亚洲自拍在线观看| 亚洲韩国欧洲国产日产av| 国产成人avxxxxx在线看| 日韩av在线精品| 欧美日韩精品在线| 欧美精品videosex极品1| 日韩a**站在线观看| 日韩欧美中文在线| 91在线观看免费| 亚洲国产免费av| 亚洲尤物视频网| 韩国一区二区电影| 久久久综合av| 性欧美视频videos6一9| 久久人人爽人人爽人人片av高请| 亚洲激情电影中文字幕| 亚洲色在线视频| 欧美疯狂做受xxxx高潮| 97在线观看免费| 久久久噜噜噜久久中文字免| 91sao在线观看国产| 欧美成年人视频网站欧美| 亚洲色图13p| 亚洲tv在线观看| www.日韩免费| 日本亚洲欧洲色α| 日韩av三级在线观看| 日韩最新免费不卡| 国产亚洲精品综合一区91| 亚洲电影av在线| 久久999免费视频| 日韩欧美在线网址| 最近日韩中文字幕中文| 亚洲色图第三页| 粉嫩av一区二区三区免费野| 久久久伊人日本| 亚洲黄色成人网| 亚洲视频axxx| 欧美激情伊人电影| 欧美激情亚洲视频| 久久男人的天堂| 91精品国产91久久久久福利| 深夜成人在线观看| 2024亚洲男人天堂| 91精品视频一区| 色婷婷久久一区二区| 69视频在线播放| 欧美日韩在线免费| 日韩美女av在线| 高清日韩电视剧大全免费播放在线观看| 亚洲国产免费av| 国产欧美欧洲在线观看| 国产精品一二三视频| 国产美女高潮久久白浆| 91久久久久久久| 日韩av黄色在线观看|