Swift3.0- swift中的問號"?"和感嘆號"!"語法

Swift語言使用var定義變量丧靡,但和別的語言不同,Swift里不會自動給變量賦初始值籽暇,也就是說變量不會有默認(rèn)值温治,所以要求使用變量之前必須要對其初始化。如果在使用變量之前不進(jìn)行初始化就會報(bào)錯(cuò):

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

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

enumOptional:LogicValue,Reflectable{caseNonecaseSome(T)init()init(_some:T)/// Allow use in a Boolean context.funcgetLogicValue()->Bool/// Haskell's fmap, which was mis-namedfuncmap(f:(T)->U)->U?funcgetMirror()->Mirror}

聲明為Optional只需要在類型后面緊跟一個(gè)?即可突琳。如:

varstrValue:String?//?相當(dāng)于下面這種寫法的語法糖varstrValue:Optional

上面這個(gè)Optional的聲明,意思不是”我聲明了一個(gè)Optional的String值”, 而是”我聲明了一個(gè)Optional類型值符相,它可能包含一個(gè)String值拆融,也可能什么都不包含”,也就是說實(shí)際上我們聲明的是Optional類型啊终,而不是聲明了一個(gè)String類型镜豹,這一點(diǎn)需要銘記在心。

建議再讀一遍上段文字蓝牲。

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

ifstrValue{//do sth with strValue}

然后怎么使用Optional值呢散怖?文檔中也有提到說,在使用Optional值的時(shí)候需要在具體的操作肄渗,比如調(diào)用方法、屬性、下標(biāo)索引等前面需要加上一個(gè)?蕴轨,如果是nil值勉抓,也就是Optional.None,會跳過后面的操作不執(zhí)行惑申,如果有值具伍,就是Optional.Some,可能就會拆包(unwrap)圈驼,然后對拆包后的值執(zhí)行后面的操作人芽,來保證執(zhí)行這個(gè)操作的安全性,比如:

lethashValue=strValue?.hashValue

strValue是Optional的字符串绩脆,如果strValue是nil萤厅,則hashValue也為nil,如果strValue不為nil靴迫,hashValue就是strValue字符串的哈希值(其實(shí)也是用Optional wrap后的值)

另外惕味,?還可以用在安全地調(diào)用protocol類型方法上,比如:

@objcprotocolDownloadable{@optionalfuncdownload(toPath:String)->Bool;}@objcclassContent:Downloadable{//download method not be implemented}vardelegate:Downloadable=Downloadable()delegate.download?("some path")

因?yàn)樯厦娴膁elegate是Downloadable類型的玉锌,它的download方法是optional名挥,所以它的具體實(shí)現(xiàn)有沒有download方法是不確定的。Swift提供了一種在參數(shù)括號前加上一個(gè)?的方式來安全地調(diào)用protocol的optional方法主守。

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

ifletdataSource=objectas?UITableViewDataSource{letrowsInFirstSection=dataSource.tableView(tableView,numberOfRowsInSection:0)}

到這里我們看到了?的幾種使用場景:

1.聲明Optional值變量

2.用在對Optional值操作中,用來判斷是否能響應(yīng)后面的操作

3.用于安全調(diào)用protocol的optional方法

4.使用 as? 向下轉(zhuǎn)型(Downcast)

另外丸逸,對于Optional值蹋艺,不能直接進(jìn)行操作,否則會報(bào)錯(cuò):

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

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

ifletstr=strValue{lethashValue=str.hashValue}

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

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

lethashValue=strValue!.hashValue

這里的!表示“我確定這里的的strValue一定是非nil的,盡情調(diào)用吧” 程储,比如這種情況:

ifstrValue{lethashValue=strValue!.hashValue}

{}里的strValue一定是非nil的蹭沛,所以就能直接加上!臂寝,強(qiáng)制拆包(unwrap)并執(zhí)行后面的操作。 當(dāng)然如果不加判斷摊灭,strValue不小心為nil的話咆贬,就會出錯(cuò),crash掉帚呼。

考慮下這一種情況掏缎,我們有一個(gè)自定義的MyViewController類,類中有一個(gè)屬性是myLabel煤杀,myLabel是在viewDidLoad中進(jìn)行初始化眷蜈。因?yàn)槭窃趘iewDidLoad中初始化,所以不能直接聲明為普通值:var myLabel : UILabel沈自,因?yàn)榉荗ptional的變量必須在聲明時(shí)或者構(gòu)造器中進(jìn)行初始化酌儒,但我們是想在viewDidLoad中初始化,所以就只能聲明為Optional:var myLabel: UILabel?, 雖然我們確定在viewDidLoad中會初始化酥泛,并且在ViewController的生命周期內(nèi)不會置為nil今豆,但是在對myLabel操作時(shí),每次依然要加上!來強(qiáng)制拆包(在讀取值的時(shí)候柔袁,也可以用?呆躲,謝謝iPresent在回復(fù)中提醒),比如:

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

對于這種類型的值捶索,我們可以直接這么聲明:var myLabel: UILabel!, 果然是高(hao)大(gui)上(yi)的語法!, 這種是特殊的Optional插掂,稱為Implicitly Unwrapped Optionals, 直譯就是隱式拆包的Optional,就等于說你每次對這種類型的值操作時(shí)腥例,都會自動在操作前補(bǔ)上一個(gè)!進(jìn)行拆包辅甥,然后在執(zhí)行后面的操作,當(dāng)然如果該值是nil燎竖,也一樣會報(bào)錯(cuò)crash掉璃弄。

varmyLabel:UILabel!//!相當(dāng)于下面這種寫法的語法糖varmyLabel:ImplicitlyUnwrappedOptional

那么!大概也有兩種使用場景

1.強(qiáng)制對Optional值進(jìn)行拆包(unwrap)

2.聲明Implicitly Unwrapped Optionals值,一般用于類中的屬性

Swift是門新生的語言构回,我們有幸見證了它的誕生夏块,激動之余也在佩服蘋果大刀闊斧的推出一個(gè)新的語言替代一個(gè)已經(jīng)比較成熟語言的魄力,今天在知乎日報(bào)上看到一個(gè)回答是說Swift是一門玩具語言纤掸,正當(dāng)想去吐槽脐供,發(fā)現(xiàn)回答已經(jīng)被刪除了。個(gè)人認(rèn)為蘋果是很認(rèn)真的推出Swift的借跪,從Swift的各種細(xì)微的設(shè)計(jì)也能看的出來政己。

另外這兩個(gè)小符號就花費(fèi)了我不少的時(shí)間來理解,可能依然會有錯(cuò)誤和不妥之處掏愁,歡迎大家指正歇由,本文旨在拋磚引玉卵牍。除此之外,Swift還有很多很棒的特性印蓖,

本文轉(zhuǎn)載https://blog.csdn.net/minggeqingchun/article/details/78193484

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辽慕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赦肃,更是在濱河造成了極大的恐慌,老刑警劉巖公浪,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件他宛,死亡現(xiàn)場離奇詭異,居然都是意外死亡欠气,警方通過查閱死者的電腦和手機(jī)厅各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來预柒,“玉大人队塘,你說我怎么就攤上這事∫搜欤” “怎么了憔古?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淋袖。 經(jīng)常有香客問我鸿市,道長,這世上最難降的妖魔是什么即碗? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任焰情,我火速辦了婚禮,結(jié)果婚禮上剥懒,老公的妹妹穿的比我還像新娘内舟。我一直安慰自己,他們只是感情好初橘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布验游。 她就那樣靜靜地躺著,像睡著了一般壁却。 火紅的嫁衣襯著肌膚如雪批狱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天展东,我揣著相機(jī)與錄音赔硫,去河邊找鬼。 笑死盐肃,一個(gè)胖子當(dāng)著我的面吹牛爪膊,可吹牛的內(nèi)容都是我干的权悟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼推盛,長吁一口氣:“原來是場噩夢啊……” “哼峦阁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耘成,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤榔昔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瘪菌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撒会,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年师妙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诵肛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡默穴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蓄诽,到底是詐尸還是另有隱情薛训,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布若专,位于F島的核電站许蓖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏调衰。R本人自食惡果不足惜膊爪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嚎莉。 院中可真熱鬧米酬,春花似錦、人聲如沸趋箩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叫确。三九已至跳芳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竹勉,已是汗流浹背飞盆。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吓歇。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓孽水,卻偏偏與公主長得像,于是被迫代替她去往敵國和親城看。 傳聞我的和親對象是個(gè)殘疾皇子女气,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容