swift語言之(可選類型瓦侮?和隱式可選類型!)

可選類型佣谐、隱式可選類型

在swift中肚吏,可選類型其根源是一個枚舉型,里面有None和Some兩種類型狭魂。其實所謂的nil就是Optional.None, 非nil就是Optional.Some, 然后會通過Some(T)包裝(wrap)原始值罚攀,這里是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  
}  

語法使用“?”操作符及"!"號操作符

如:“var optionalString: String? = "Hello"
optionalString == nil
 
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}”

大家把optionalName改為nil時看一下會有什么結(jié)果雌澄?按照理解斋泄,應(yīng)該是? = 后的為可選值掷伙,即當(dāng)我們的的變量為nil時是己,這里如果有?=操作任柜,則會使用卒废?=后的值作為默認值沛厨,而不會為nil. 這個等有環(huán)境時,驗證一下摔认。
經(jīng)驗證:
分別執(zhí)行:

var optional :String? = "ok good";//注意?與=號之間有空格?號緊貼最后一個字母不能有空格  
println(optional) 

輸出為:
ok good

var optional :String?//注意?與=號之間有空格?號緊貼最后一個字母不能有空格  
println(optional)  

輸出為:
nil

來看下官方釋為隱式解包:主要用在一個變量/常量在定義瞬間完成之后值一定會存在的情況逆皮。這主要用在類的初始化過程中。

var optionVariables:String? //?相當(dāng)于下面這種寫法的語法糖  
//var optionVariables : Optional<Int>  
let value = optionVariables?.hashValue  
/* 
optionVariables是可選類型的字符串参袱,如果optionVariables是nil电谣,則hashValue也為nil 
如果optionVariables不為nil,hashValue就是strValue字符串的哈希值 
到這里我們看到了?的兩種使用場景: 
1.聲明Optional值變量 
2.用在對Optional值操作中抹蚀,用來判斷是否能響應(yīng)后面的操作 
*/  
  
//對于可選類型變量剿牺,不能直接進行操作,否則會報錯  
//let hashval = optionVariables.hashValue //'String?' does not have a member named 'hashValue'  
//因此要訪問值就需要解包环壤,解包有兩種  
//第一種:使用if let/var xxx =   
if let hv = optionVariables  
{  
    //run ok;  
}  
  
//第二種:使用!號  
let hv = optionVariables!.hashValue  
  
//這里的!表示“我確定這里的的strValue一定是非nil的晒来,盡情調(diào)用吧” ,比如這種情況:  
  
if optionVariables {  
    let hashv = optionVariables!.hashValue  
}  
//{}里的optionVariables一定是非nil的郑现,所以就能直接加上!湃崩,強制拆包(unwrap)并執(zhí)行后面的操作  

凡在變量或常量后加上?的都是一個可選變量/可選常量
凡在變量或常量后加上!的都是隱式可選變量/常量,有點難理解接箫,首先該變量或常量滿足可選類型攒读,其主要是可被當(dāng)生一般的變量/常量來使用,而不需要每次都驗證是否有值辛友。
注:如果一個隱式解包的可選類型不包含一個實際值薄扁,那么對它的訪問會拋出一個運行時錯誤。在變量/常量名后面加废累!的情況也是一樣的泌辫。

var possibleString: String? = "An optional string."  
//possibleString = nil  
println(possibleString) // possibleString 為可選變量,需要使用!來訪問的值  

分析:首先 possibleString 因后面帶上了?說明這是一個可選的九默,同時前面加上var為變量,所以這是一個可選類型的變量宾毒。其可選值為 "An optional string." 再來看執(zhí)行println后驼修,可以看出輸出為 An optional string. 這點很明顯。再來看一下把println這句改一下改為 (即在可選變量后面加上一個!號诈铛。)

println(possibleString!) // possibleString 為可選變量乙各,需要使用!來訪問的值

這里結(jié)果與沒有加!號時是完全一樣的,輸出為An optional string.
好幢竹,現(xiàn)在重點來了耳峦,這是很關(guān)鍵的一個測試。把possibleString = nil 這句注釋放開讓其動行焕毫,再分別來看一下println帶!和不帶!的情況:
情況一:不帶蹲坷!號時驶乾,輸出為nil .

  var possibleString: String? = "An optional string."  
        possibleString = nil  
        println(possibleString)  

情況二:再來看一下帶!號

  var possibleString: String? = "An optional string."  
        possibleString = nil  
        println(possibleString!) // possibleString 為可選變量,需要使用!來訪問的值

這時運行到這句println就會crash了循签。會報
fatal error: Can't unwrap Optional.None
錯誤级乐。
在情況一時,為什么不會報錯县匠,是因為這是一個可選變量當(dāng)變量為nil時风科,自動驗證是否有可選的值,有則使用可選值,在情況二乞旦,加上!訪問符來訪問possibleString 變量贼穆,但由于possibleString設(shè)為了nil (等價于var possibleString: String?) 其并沒有包含一個實際值,所以拋異常.同樣對于下面使用!號來聲明的也一樣

var assumedString: String! = "An implicitly unwrapped optional string."  
        assumedString = nil  
        println(assumedString!)

如果你定義了一個可選類型并且沒有給予初始值的時候兰粉,會默認設(shè)置為nil
var surveyAnswer: String? // 初自動設(shè)置為nil
注: Swift 的nil不同于Object-C中的nil. Object-C中故痊,nil是一個指針指向不存在的對象。Swift中亲桦,nil不是指針而是一個特定類型的空值崖蜜。任何類型的可選變量都可以被設(shè)為nil,不光是指針客峭。
在swift中作何變量/常量的聲明都必須帶有初始值豫领,否則就要聲明為可選型。
即var btn:UIButton 這樣是編譯報錯的舔琅。因些必須改為帶初始化的如:
var btn2 :UIButton = UIButton()
或者使用? 和! 來約束等恐。
因此常常聲明可選或隱式可選變量如:
var btn :UIButton? // 默認btn = nil
var edt :UITextField! // 默認edt = nil

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市备蚓,隨后出現(xiàn)的幾起案子课蔬,更是在濱河造成了極大的恐慌,老刑警劉巖郊尝,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二跋,死亡現(xiàn)場離奇詭異,居然都是意外死亡流昏,警方通過查閱死者的電腦和手機扎即,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來况凉,“玉大人谚鄙,你說我怎么就攤上這事〉笕蓿” “怎么了闷营?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長知市。 經(jīng)常有香客問我傻盟,道長速蕊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任莫杈,我火速辦了婚禮互例,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筝闹。我一直安慰自己媳叨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布关顷。 她就那樣靜靜地躺著糊秆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪议双。 梳的紋絲不亂的頭發(fā)上痘番,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音平痰,去河邊找鬼汞舱。 笑死,一個胖子當(dāng)著我的面吹牛宗雇,可吹牛的內(nèi)容都是我干的昂芜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赔蒲,長吁一口氣:“原來是場噩夢啊……” “哼泌神!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舞虱,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤欢际,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矾兜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损趋,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年椅寺,在試婚紗的時候發(fā)現(xiàn)自己被綠了舶沿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡配并,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出高镐,到底是詐尸還是另有隱情溉旋,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布嫉髓,位于F島的核電站观腊,受9級特大地震影響邑闲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梧油,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一苫耸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儡陨,春花似錦褪子、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胚股,卻和暖如春笼痛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琅拌。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工缨伊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人进宝。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓刻坊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親即彪。 傳聞我的和親對象是個殘疾皇子紧唱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,834評論 0 6
  • 關(guān)于 Swift 重要這個文檔所包含的準(zhǔn)備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,301評論 1 27
  • 2014年的蘋果全球開發(fā)者大會(WWDC)隶校,當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,294評論 0 9
  • Swift 是一門開發(fā) iOS, macOS, watchOS 和 tvOS 應(yīng)用的新語言漏益。然而,如果你有 C 或...
    XLsn0w閱讀 922評論 2 1
  • Swift 介紹 簡介 Swift 語言由蘋果公司在 2014 年推出深胳,用來撰寫 OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,212評論 3 25