swift當中的optional型別,表明乙個變數可能有確認的值,也可能不包含任何值。不包含任何值在swift當中,就是乙個nil。
swift當中的變數或者常量,在使用之前必須得賦值,但是對於optional型別來說,情形有點不一樣。對於optional變數來說,使用之前可以不用賦值:
var a: int?var b = a //正確
let c = a //正確
這是因為對於optional變數來說,如果不賦任何值,編譯器預設賦nil。
但是上述情況對於optional常量不適用,如果optional常量未顯示賦值就是用,編譯器報錯:
let c: int?var a = c //報錯
即使顯示對optional常量賦值nil,也是可以的:
let c: int?c = nil
var a = c //正確
swift當中不能重複宣告變數,即使變數名字相同,型別不同也不行,或者將同乙個名字宣告為變數的同時,還宣告成常量也不行。在這裡,將相同名字的變數宣告成optional型別也不行:
var a:intvar a:int? //報錯
let a:int
var a:int? //報錯
let a:int
let a:int? //報錯
總結起來就是一句話,如果變數或者常量相同,那麼就只能宣告一次。
swift中optional的變數或者常量,不能直接複製給非optional的變數或者常量,但是反過將非optional的變數或者常量,賦值給optional的變數或者常量是沒問題的:
let a: int? = 1let b: int = a //報錯
var a: int? = 1
var b: int = a //報錯
let a: int = 1
let b: int? = a //可以
var a: int = 1
var b: int? = a //可以
var a: int? = 1if a != nil
為什麼對於optional型別使用前要先監測呢?
因為如果不檢測就是用!求值,如果求出來的值是nil,會發生執行時錯誤:
var a: int?print(a!) //發生執行時錯誤
文字解釋optional binding費勁,直接看**:
var a: int? = 1if let b = a else
上面if語句當中的let b = a就是optional binding,如果a有值,那麼a的值會賦給b,否則,if語句不成立,將執行else語句。
這裡進行optional binding的時候,適用var b = a也是沒有問題的,但是由於編譯器發現你對b沒有改動,會出警告,提示你最好使用let。
另外乙個需要注意的地方就是,這裡宣告的b,只能在if語句內部使用。
多個optional bindings可以一起使用,當中用逗號隔開就行,如果任何乙個optional binding為nil,那麼if語句就不會執行:
var a: int? = 1var b: int? = nil
if let c = a, let d = b else
對於optional binding來說,出了在if語句當中使用,還可以在while語句當中使用。
var a: int? //optional
var a: int! = 2
var b = a //b型別是optional的
Swift中的Optional型別
swift當中的optional型別,表明乙個變數可能有確認的值,也可能不包含任何值。不包含任何值在swift當中,就是乙個nil。swift當中的變數或者常量,在使用之前必須得賦值,但是對於optional型別來說,情形有點不一樣。對於optional變數來說,使用之前可以不用賦值 var a i...
iOS筆記 Swift中的Optional型別
在objective c中並沒有optional型別,只有nil,並且nil只能用於表示物件型別無值,並不能用於基礎型別 int,float 列舉和結構體,基礎型別需要返回類似nsnotfound的特殊值來表示無值,所以在swift中定義了optinal型別來表示各種型別的無值狀態,並規定了nil不...
如何理解Swift中Optional的 和
很多人在剛上手swift時對於optional中 和 的使用十分不理解,接下來我會談一談自己對於這兩個符號的使用方式的理解。先來說說optional的概念,以方便之後的理解。來看一下下面的 var a string nil 編譯錯誤,string型別不能為nil var b string hello...