swift的可选值(optional)
蘋果那文檔寫了一大堆也沒有好好的寫一下可選值(optional)這個東西。就是在有一個“Optional Chaining”的章節(jié),但是也不是很充分的說明。最后找了半天在“the basics”里墨跡了幾句。如果你沒找到optional這個東西的話,那你可能也錯過了一個很重要的東西,非optional類型的變量,這個變量的值不能是nil。這一點(diǎn)和ObjC以及其他的編程語言如C#、Java什么的差別很大。
| 1 2 | var example : String?=?"hello world" example?=?nil?//ERROR,?Type?'String'?does?not?conform to protocol?'NilLiteralConvertible' |
Optional的值就是可以為空也可以不為空的。定義的方式是這個樣子的:
| 1 | var example : String??=?"hello world" |
對,就是在類型后面的那個問號。有了這個問號,這個變量就是optional的了。它的值就可以為nil了。但是,你是不能直接訪問這個變量。
書接上文,非optional的變量不可以賦值為nil的特點(diǎn)。讓編程變的安全。因?yàn)?#xff0c;如果不檢查是否為空就直接使用的話是編譯不過的。如:
| 1 2 3 | var example : String??=?"hello world" //example?=?nil var example2 : String?=?example????//ERROR, value of optional?type?'String?'?not?unwrapped |
錯誤的提示說的是optional類型的變量沒有“拆包”。那么,如何拆包呢。很簡單,只要在后面加上一個感嘆號就可以了,如:
| 1 2 3 | var example : String??=?"hello world" //example?=?nil var example2 : String?=?example! |
“!”感嘆號unwrapp,拆包optional的變量。如果這個變量下有值的話就返回這個值,沒有的話就會產(chǎn)生一個運(yùn)行時的錯誤。
所以呢,蘋果推薦了一種更安全的使用optional類型變量的方法。首先設(shè)定一個Employee類。它有一個成員屬性為name。
| 1 2 3 4 5 6 7 | class?Employee { ????var name : String ????? ????init(name: String){ ????????self.name?=?name ????} } |
然后,初始化一個Employee實(shí)例,并設(shè)定它是optional的:?var?e : Employee? = Employee(name:"Tom")。這個時候如果直接訪問name屬性就會報錯,e.name = "Tom Cat" // ERROR。如上所說需要拆包。e!.name = "Tom Cat"。那么安全的方式是什么樣呢:
| 1 2 3 4 5 6 7 8 | var e : Employee??=?Employee("Tom") if?let en?=?e?.name { ????println("employee's name is \(en)") } else{ ????println("unable to identify the employee") } |
直接用感嘆號的方法訪問可能會運(yùn)行時錯誤,如:let en = e!.name。
延伸閱讀:“?”問號和“!”感嘆號。都是Optional<T>的簡寫。更多請了解swift的泛型和Optional<T>。
?
歡迎加群互相學(xué)習(xí),共同進(jìn)步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,轉(zhuǎn)載請注明出處!本文轉(zhuǎn)自張昺華-sky博客園博客,原文鏈接:http://www.cnblogs.com/sunshine-anycall/p/4018142.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的swift的可选值(optional)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 磁盘 I/O 的概念
- 下一篇: 用ipad维护Linux服务器