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

首頁(yè) > 編程 > Swift > 正文

Swift中 !和 ?的區(qū)別及使用

2020-03-09 17:46:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

相信大家在學(xué)習(xí)和使用Swift的時(shí)候,肯定會(huì)被 ! 和  ? 搞瘋過(guò), 糾結(jié)這兩個(gè)符號(hào)到底是個(gè)什么鬼 ?鬼知道什么時(shí)候使用!,什么時(shí)候使用?

下面就說(shuō)一下! 和 ? 區(qū)別以及該怎么使用!

? 和 ! 到底是個(gè)啥

? 和 ! 其實(shí)分別是Swift語(yǔ)言中對(duì)一種可選類(lèi)型( Optional) 操作的語(yǔ)法糖。 那可選類(lèi)型是干什么的呢? Swift中是可以聲明一個(gè)沒(méi)有初始值的屬性, Swift中引入了可選類(lèi)型(Optional)來(lái)解決這一問(wèn)題。它的定義是通過(guò)在類(lèi)型生命后加加一個(gè) ? 操作符完成的。

例如: var name: String?

Optional其實(shí)是個(gè)enum,里面有None和Some兩種類(lèi)型。其實(shí)所謂的nil就是Optional.None , 非nil就是Optional.Some, 然后會(huì)通過(guò)Some(T)包裝(wrap)原始值,這也是為什么在使用Optional的時(shí)候要拆包(從enum里取出來(lái)原始值)的原因。

這里是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 }

既然這樣, 那對(duì)于 var name: String? 該怎樣去理解這句語(yǔ)法呢?

var name: String?

//  上面這個(gè)Optional的聲明,是”我聲明了一個(gè)Optional類(lèi)型值,它可能包含一個(gè)String值,也可能什么都不包含”,也就是說(shuō)實(shí)際上我們聲明的是Optional類(lèi)型,而不是聲明了一個(gè)String類(lèi)型  (這其實(shí)理解起來(lái)挺蛋疼的...)

? 和 ! 使用

一旦聲明為Optional的,如果不顯式的賦值就會(huì)有個(gè)默認(rèn)值nil。判斷一個(gè)Optional的值是否有值,可以用if來(lái)判斷:

if name {
    // 有值再操作
}

怎么使用Optional值呢?文檔中也有提到說(shuō),在使用Optional值的時(shí)候需要在具體的操作,比如調(diào)用方法、屬性、下標(biāo)索引等前面需要加上一個(gè)?,如果是nil值,也就是Optional.None,會(huì)跳過(guò)后面的操作不執(zhí)行,如果有值,就是Optional.Some,可能就會(huì)拆包(unwrap),然后對(duì)拆包后的值執(zhí)行后面的操作,來(lái)保證執(zhí)行這個(gè)操作的安全性。

// 例如:

 let length = name?.characters.count 

PS:對(duì)于 Optional 值,不能直接進(jìn)行操作,否則會(huì)報(bào)錯(cuò)。

? 的使用場(chǎng)景:

1.聲明Optional值變量
2.用在對(duì)Optional值操作中,用來(lái)判斷是否能響應(yīng)后面的操作
3.使用 as? 向下轉(zhuǎn)型(Downcast)

上面提到Optional值需要拆包(unwrap)后才能得到原來(lái)值,然后才能對(duì)其操作,那怎么來(lái)拆包呢?

拆包有兩種方法:

可選綁定(Optional Binding)

可選綁定(Optional Binding)是一種更簡(jiǎn)單更推薦的方法來(lái)解包一個(gè)可選類(lèi)型。 使用可選綁定來(lái)檢查可選類(lèi)型的變量有值還是沒(méi)值。如果有值, 解包它并且將值傳遞給一個(gè)常量或者變量。

// 例子最為簡(jiǎn)單明了var str: String? = "Hello"let greeting = "World!"if let name = str {  let message = greeting + name  print(message)}/**自然語(yǔ)言解釋意思:就是如果str有值,解包它,并且將它的值賦值給name, 然后執(zhí)行下面的條件語(yǔ)句; 如果str為空, 直接跳過(guò)條件語(yǔ)句塊。*/ 

硬解包

硬解包即直接在可選類(lèi)型后面加一個(gè)感嘆號(hào)(!)來(lái)表示它肯定有值。 

 var str1: String? = "Hello"let greeting = "World!"if (str1 != nil) {  let message = greeting + str1!  print(message)}/**上面例子,我們只是自己知道str1肯定有值, 所以才直接硬解包了str1變量。 但是萬(wàn)一有時(shí)候我們的感覺(jué)是錯(cuò)的, 那程序在運(yùn)行時(shí)可能會(huì)出現(xiàn)嚴(yán)重的錯(cuò)誤. 所以Swift中是推薦先檢查可選類(lèi)型是否有值, 然后再進(jìn)行解包的!*/ 

錯(cuò)誤示范:

var str1:String?  // str1值可能是傳過(guò)來(lái)的值或者從服務(wù)器獲取的值let msg = "Hi"let txt = msg + str1! // runtime error/** 以上代碼在編譯階段不會(huì)報(bào)錯(cuò).因?yàn)槭褂昧擞步獍? 編譯器認(rèn)為可選類(lèi)型是有值的, 所以編譯是通過(guò)的. 當(dāng)代碼運(yùn)行起來(lái)時(shí), 知名的錯(cuò)誤將會(huì)出現(xiàn): `fatal error: Can't unwrap Optional.None`*

PS:對(duì)于  ! 操作符,這里的變量值一定是非nil的!

其實(shí), 還有一種叫隱式拆包(Implicitly Unwrapped Optionals),比如 對(duì)于會(huì)在viewDidLoad進(jìn)行初始化的變量,可以直接定義為var str :String! 等于說(shuō)你每次對(duì)這種類(lèi)型的值操作時(shí),都會(huì)自動(dòng)在操作前補(bǔ)上一個(gè)!進(jìn)行拆包,然后在執(zhí)行后面的操作,當(dāng)然如果該值是nil,會(huì)報(bào)錯(cuò)crash掉。

舉個(gè)很淺顯的栗子:

// 在一個(gè)viewController里面,從xib里面拖一個(gè)UIImageView控件, 你會(huì)發(fā)現(xiàn)Xcode會(huì)自動(dòng)給你轉(zhuǎn)成下面的形式  @IBOutlet weak var headerBGImageView: UIImageView!/** 聲明Implicitly Unwrapped Optionals值,一般用于類(lèi)中的屬性*/

PS:如果你在隱式解析可選類(lèi)型沒(méi)有值的時(shí)候進(jìn)行取值,會(huì)crash。和在沒(méi)有值的可選類(lèi)型里面拆包是一樣的。

! 的使用場(chǎng)景

1.強(qiáng)制對(duì)Optional值進(jìn)行拆包(unwrap)
2.聲明隱式拆包變量,一般用于類(lèi)中的屬性

結(jié)束

其實(shí)! 和 ? 的問(wèn)題是很坑的,不要看它僅僅是兩個(gè)符號(hào),因?yàn)橹灰幸粋€(gè)不小心,不注意,你會(huì)發(fā)現(xiàn)項(xiàng)目運(yùn)行起來(lái),會(huì)莫名的crash掉了,關(guān)鍵是Debug模式也不是很方便定位錯(cuò)誤類(lèi)型。 自己整理一下關(guān)于 可選類(lèi)型的相關(guān)使用,一是記錄和鞏固所學(xué),而是希望會(huì)對(duì)大家有所幫助。 本文可能會(huì)有錯(cuò)誤和不妥之處,還望提出,我會(huì)及時(shí)改正。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
天天操天天射天天舔| 黄色电影在线免费观看| 午夜激情一区二区| 91cn在线观看| 一二三四在线观看视频韩国| 成人免费一区二区三区牛牛| 蜜臀91精品国产高清在线观看| 高清在线观看免费| 久久久久久久久久久一区| 99久久久久久久久| 日韩电影在线播放| 久久久免费高清视频| 艳母动漫在线看| 国模精品视频一区二区三区| 日韩视频在线观看免费| 尤物tv在线精品| 天堂在线中文网| 国内精品免费**视频| 成人午夜888| 黄网站app在线观看| 国色天香2019中文字幕在线观看| 综合色婷婷一区二区亚洲欧美国产| 福利片在线免费观看| 受虐m奴xxx在线观看| www.四虎在线观看| 久久综合狠狠综合| 国产成人免费视频网站视频社区| 中国美女乱淫免费看视频| 网站一区二区| wwwwww国产| 狠狠人妻久久久久久综合蜜桃| 三级在线观看视频| 五十路六十路七十路熟婆| 国产精选第一页| 五月天久久综合网| 懂色av一区二区在线播放| 中日韩午夜理伦电影免费| 日韩成人激情在线| 欧美三级日韩三级| 99久久精品久久亚洲精品| 亚洲一区二区天堂| 38少妇精品导航| bbw丰满大肥奶肥婆| 天天操天天综合网| 欧美激情精品久久久久久久变态| 亚洲精品无码专区| www.99av| 成人做爰69片免网站| 国产精品99久久不卡二区| 人体内射精一区二区三区| 7777精品伊人久久久大香线蕉经典版下载| 国产伦乱精品| 91成人在线| 久久亚洲精品视频| xxx亚洲日本| 亚洲36d大奶网| 亚洲国产高清av| gogogo影视剧免费观看在线观看| 精品一区毛片| 欧美激情第四页| 你懂的网站在线观看| 一本色道久久88综合日韩精品| 在线观看免费视频一区| 2020国产精品自拍| 欧美 变态 另类 人妖| 波多野结衣亚洲一区| 尤物网精品视频| 欧美性xxxxxbbbbbb精品| 精品国产免费久久久久久尖叫| 亚洲二区视频在线| 91在线视频在线| 欧美电影在线观看完整版| 日韩电影中文字幕av| 中文字幕人妻一区二区在线视频| 国产裸体永久免费无遮挡| jizzjizzjizz孕妇| 欧美啪啪免费视频| 亚洲精品久久久久久久久久久| 国产久草在线| 在线一区二区不卡| 日韩在线视频第一页| 日韩久久精品电影| 日韩av中文| 你懂的在线网址| 亚洲人人夜夜澡人人爽| 久久精品黄色片| 石原莉奈一区二区三区高清在线| 色阁综合伊人av| 懂色av一区二区三区四区| 污污网站在线免费观看| 裸体丰满少妇做受久久99精品| 污污影院在线观看| 成人一级视频| freehdxxxx| 欧美一区二区日韩一区二区| 国产人妖ts一区二区| 蜜臀av午夜精品| 国产毛片久久久久| 久久国产精品亚洲va麻豆| 希岛爱理一区二区三区av高清| 亚洲精品中文在线| 国产jjizz一区二区三区视频| 日韩视频免费大全中文字幕| 中文字幕在线一区免费| 91精品国产乱| 欧美日韩高清一区二区三区| 美女又爽又黄| 日韩欧美一二区| 国产黄a三级三级三级av在线看| 污视频网站免费观看| 99热这里只有精品7| 亚洲大全视频| 亚洲精品97久久久babes| 国产精品99久久久久久白浆小说| 欧美在线视频导航| eeuss网址直达入口| 国产又爽又黄免费软件| 日本一二三区视频| 日本欧美一区| 久久久久亚洲av无码专区体验| 国产wwwwxxxx| 亚洲免费不卡| 中文无码日韩欧| 影院在线观看全集免费观看| 国产夫妻自拍一区| 亚洲综合色在线观看| 亚洲福利视频一区| 国产人久久人人人人爽| 综合激情亚洲| 萌白酱国产一区二区| 很黄很黄的网站免费的| 亚洲a在线播放| 91香蕉视频免费在线观看| 久久理论片午夜琪琪电影网| 国产91久久久久蜜臀青青天草二| 91在线免费观看| 在线亚洲国产精品网站| 91av中文字幕| 欧美激情一区二区三区免费观看| 97在线观看免费高清| 欧洲美女免费图片一区| 亚州精品视频| 日韩精品中文字幕吗一区二区| 免费观看四虎精品成人| 黑人巨大精品欧美一区二区奶水| 卡通动漫亚洲综合| 国产在线成人精品午夜| 国产在线播放你懂的| 国产精品美女久久久久久久久久久| 国产精品111| 亚洲av无码一区二区三区观看| 爱爱视频免费在线观看| 中文字幕亚洲精品乱码| 国产精品久久久| 青青在线视频观看| 欧美不卡视频一区发布| 色婷婷国产精品久久包臀| 91麻豆精品国产91久久久平台| 性xxxx丰满孕妇xxxx另类| 久久99久久精品| 澳门久久精品| 日韩欧美一级二级三级| 成年人网站免费视频| 国产精品天干天干在线综合| 男人和女人做事情在线视频网站免费观看| 国产亚洲精久久久久久无码77777| 视频精品一区| 男女私大尺度视频| 暖暖视频日本免费| 韩国av一区| 四虎精品一区二区| 91麻豆免费看片| 国产丝袜一区视频在线观看| 麻豆精品密在线观看| 欧美日韩少妇| 色呦呦在线资源| 国产一区二区不卡视频在线观看| 亚洲色图视频网站| 国内成人自拍| www.成年人| 国产精品久久久久久久午夜| www.久久久久久久久久久| 久久福利精品| 少妇无套高潮一二三区| 99久久99久久| 国产男女无遮挡猛进猛出| freexxxx性特大另类| 欧美日韩视频精品二区| 99热在线观看免费精品| 视频一区 中文字幕| 成人午夜sm精品久久久久久久| 欧美久久久久久久久| 国产又黄又大又粗的视频| 亚洲国产wwwccc36天堂| 疯狂撞击丝袜人妻| 国产又黄又大又爽| 色老板视频在线观看| 国内自拍欧美激情| 亚洲国产精品av| 亚洲无亚洲人成网站77777| 国产精品自在在线| 欧美精品羞羞答答| 午夜视频在线免费播放| 欧美激情第一页在线观看| 国产一区二区三区观看| 狠狠操一区二区三区| 夜夜操夜夜操| 国产精品精品久久久久久| 久久久噜噜噜久久中文字免| 国产高清不卡| 亚洲天堂精品在线观看| 久久久久久久久久国产精品| 欧美成人免费观看| 日韩电影在线观看中文字幕| 成人直播在线观看| 两个人看的免费完整在线观看| 瑟瑟网站在线观看| 亚洲午夜私人影院| 69xx绿帽三人行| 日韩亚洲欧美高清| 国产一级免费| 少妇久久久久久久久久| 欧美韩国理论所午夜片917电影| 福利视频大全| 一区二区三区回区在观看免费视频| www视频免费| 三级影片在线观看欧美日韩一区二区| 久久国产日韩欧美| 欧美午夜不卡在线观看免费| 亚洲自拍偷拍一区| 精品国产一区二区三区四区四| 一区二区三区不卡视频在线观看| 福利小视频在线| 日韩av片免费在线观看| 欧美久久久久久久久中文字幕| 国产黄色在线网站| 久久国产精品影院| 国产乡下妇女做爰| 日韩欧美资源站| 国产精品福利在线| 麻豆精品视频在线观看| 成人在线视频成人| 欧美 日韩 国产 一区二区三区| 久久无码av三级| 久草热视频在线观看| 欧美成人高潮一二区在线看| av在线播放成人| 黑人精品一区二区三区| 精品国产一区二区三区久久久蜜臀| 久久久免费高清视频| 色综合视频一区中文字幕| 欧美精品午夜视频| 日韩亚洲综合在线| 中文在线资源| 乱色精品无码一区二区国产盗| 日本精品一二三| 欧美精品videos| 一区二区亚洲精品国产| 国内精品伊人久久久久av一坑| 国产高清不卡视频| xxxx性bbbb欧美| 国产精品欧美激情在线播放| 5566成人精品视频免费| 免费成人高清在线视频theav| 中文字幕在线播放| 久久亚洲精品毛片| 精品日韩欧美| 男人操女人免费| 亚洲一区二区三区不卡国产欧美| 能免费看av的网站| 五月天婷亚洲天综合网鲁鲁鲁| 国产99午夜精品一区二区三区| 在线观看视频h| 国产成人鲁鲁免费视频a| 一区二区三区毛片| 亚洲免费黄色网| av不卡在线看| 亚洲一区 视频| 日韩午夜电影在线观看| 亚洲欧美另类在线| 欧美a级片一区| 日韩一区二区三区四区视频| 懂色av蜜臀av粉嫩av喷吹| 日韩精品――中文字幕| jizz视频18| 在线播放成人av| 国产91精品青草社区| 色婷婷av一区二区三区之红樱桃| 91av在线免费| 精品日韩中文字幕| 俄罗斯毛片基地| 手机在线观看毛片| 美女视频免费一区| av网址在线播放| 18岁成年人网站| 欧美不卡视频在线观看| 四虎成人精品在永久在线观看| 亚洲三级小视频| 久久精品无码人妻| 久久一区二区电影| 国产成人在线观看网站| 韩国精品一区二区三区六区色诱| 99re66热这里只有精品8| 日本不卡一区二区三区四区| 97超碰欧美中文字幕| 国产亚洲精品久久久久久打不开| 粉嫩久久久久久久极品| 蜜臀久久精品久久久用户群体| 日韩精品亚洲视频| 最近2019中文字幕第三页视频| 久久97人妻无码一区二区三区| 亚洲免费观看高清完整版在线观看| 青青久久av北条麻妃海外网| 亚洲在线观看av| 久久久久亚洲av无码a片| 97精品国产97久久久久久粉红| 亚洲人在线观看视频| bt7086福利一区国产| 天天射天天色天天干| 免费高潮视频95在线观看网站| 欧美福利一区二区三区| 中文字幕亚洲字幕| 99超碰麻豆| 亚洲人成网站免费播放| 狠狠狠色丁香婷婷综合激情| 9久久9毛片又大又硬又粗| 欧美极品影院| 日本欧美一区二区三区|