swift ? ! 解析

挺向往這里

? ? 最近公司項(xiàng)目開始用swift寫香到,自己也開始學(xué)習(xí),畢竟蘋果出這個(gè)語言,是準(zhǔn)備以后會替代OC的悠就。

在對于使用千绪? !時(shí)自己感到很困惑梗脾,怎么區(qū)分荸型?。炸茧。瑞妇。。梭冠。

辕狰? 有可能為nil ? ? !一定為非nil ?帶著疑慮 開始探索控漠。柳琢。。润脸。柬脸。。

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

var stringValue : String

//error: variable 'stringValue' used before being initialized

//let hashValue = stringValue.hashValue

let hashValue = stringValue.hashValue

? ?上面了解到的是普通值,接下來Optional值要上場了铭段,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的定義:

enum Optional: 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(f: (T) -> U) -> U?

func getMirror() -> Mirror

}

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

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

var strValue: 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è)操作的安全性,比如:

let hashValue = strValue?.hashValue

strValue是Optional的字符串诅福,如果strValue是nil匾委,則hashValue也為nil,如果strValue不為nil氓润,hashValue就是strValue字符串的哈希值(其實(shí)也是用Optional wrap后的值)

另外赂乐,?還可以用在安全地調(diào)用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")

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

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

iflet dataSource =objectas?UITableViewDataSource {

let rowsInFirstSection= dataSource.tableView(tableView, numberOfRowsInSection:0)

}

? ? 的幾種使用場景:

1.聲明Optional值變量

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

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

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

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

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

ifstrValue { ??let hashValue= 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值,一般用于類中的屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溜畅,一起剝皮案震驚了整個(gè)濱河市捏卓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌达皿,老刑警劉巖天吓,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異峦椰,居然都是意外死亡龄寞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門汤功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來物邑,“玉大人,你說我怎么就攤上這事滔金∩猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵餐茵,是天一觀的道長科阎。 經(jīng)常有香客問我,道長忿族,這世上最難降的妖魔是什么锣笨? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任蝌矛,我火速辦了婚禮,結(jié)果婚禮上错英,老公的妹妹穿的比我還像新娘入撒。我一直安慰自己,他們只是感情好椭岩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布茅逮。 她就那樣靜靜地躺著,像睡著了一般判哥。 火紅的嫁衣襯著肌膚如雪献雅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天姨伟,我揣著相機(jī)與錄音惩琉,去河邊找鬼豆励。 笑死夺荒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的良蒸。 我是一名探鬼主播技扼,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嫩痰!你這毒婦竟也來了剿吻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤串纺,失蹤者是張志新(化名)和其女友劉穎丽旅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺棺,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榄笙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祷蝌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茅撞。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巨朦,靈堂內(nèi)的尸體忽然破棺而出米丘,到底是詐尸還是另有隱情,我是刑警寧澤糊啡,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布拄查,位于F島的核電站,受9級特大地震影響棚蓄,放射性物質(zhì)發(fā)生泄漏堕扶。R本人自食惡果不足惜腺毫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挣柬。 院中可真熱鬧潮酒,春花似錦、人聲如沸邪蛔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侧到。三九已至勃教,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匠抗,已是汗流浹背故源。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汞贸,地道東北人绳军。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像矢腻,于是被迫代替她去往敵國和親门驾。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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

  • Swift語言使用var定義變量多柑,但和別的語言不同奶是,Swift里不會自動給變量賦初始值,也就是說變量不會有默認(rèn)值竣灌,...
    子鍵_北京不眠夜閱讀 206評論 0 0
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,829評論 0 6
  • 1.元組 1.1什么是元組 在其他語言中很早就有元組這個(gè)概念, 但是對于OC程序員來說這是一個(gè)新的概念官方定義:元...
    高俊閱讀 425評論 0 0
  • var 定義變量時(shí),不會給變量賦初值削樊,所以就意味著豁生,我們必須要在使用變量之前給變量賦初值,如果不賦初值將會報(bào)錯(cuò)漫贞。 ...
    后浪普拉斯閱讀 804評論 0 2
  • 轉(zhuǎn)載于: http://joeyio.com/ios/2014/06/04/swift---/ Swift語言使用...
    透支未來閱讀 264評論 0 0