關于可選值optional
不同于OC,swift引入了一個新的概念——可選值,了解這個optional,對于swift的學習至關重要
概念定義:可以有值也可以沒有值(nil)的一個類型。換句話說,它有兩個狀態(tài):有值,沒有值(nil)
按我的理解,可選值是帶有布爾類型加持的普通類型
如何定義一個可選值呢?
上面的代碼簡單定義了一個叫做optionalValue的可選值。
和普通的變量定義沒有太大區(qū)別,唯一不同在于,這里多了一個問號,?是對普通值的封包 要加在類型后面,也就是說,在變量或者常量的所屬類型后面加一個問號就可以將其定義為一個optional
這里我給它賦值80,如果不賦值,那么它默認將是nil
可選值的強制解包forced unwrapping
通過在類型后面加一個問號,可以將這個變量或常量變?yōu)榭蛇x值,那么反過來要怎么做呢?
swift提供了解包操作,只需在可選值后面加一個嘆號,就可以將可選值強制解包
據(jù)說,帶有強制性質的事,都不是什么好事,于是問題來了……
上面的代碼中,我創(chuàng)建了一個optional變量,沒有賦值,那默認就是nil
在第二行當我試圖將這個optional解包時,出現(xiàn)了錯誤。
原來,nil的可選值解包時候會出現(xiàn)錯誤,蘋果的官方文檔也強調,如果你不100%確信這個可選值有值,那么不要用強制解包
可選值綁定Optional Binding
既然強制解包在可選值為nil的時候會報錯,那怎么將可選值里的數(shù)據(jù)讀取出來呢?
swift提供了一個更加安全的方法——可選值綁定Optional Binding
上面是官方文檔提供的用法,不太明確,下面是代碼演示:
上面的代碼中,我先定義了一個可選值字符串,賦值為90,然后用optional binding創(chuàng)建一個叫做tempValue的常量,if語句會根據(jù)tempValue是否從optionalValue中獲取了值來決定是否要來打印出這個值,playground的結果顯示這個tempValue被賦予了“90”
而當我不給可選值賦值,讓它默認為nil的時候,打印tempValue也沒有報錯,if判斷tempValue沒有從optionValue中獲取值,就什么也沒有做,當然也不會報錯。
這就相當于給可選值找了一個中間人,間接判斷并讀取可選值中的內容,在不確定當前可選值時否為nil的情況下,蘋果官方推薦用這個方式判斷可選值是否為nil并嘗試獲取可選值的數(shù)據(jù)。
更多內容請訪問 http://www.companysz.com/updating/ 轉載請注明出處
新聞熱點
疑難解答