Swift中的Optional型別

2021-10-24 09:57:54 字數 1877 閱讀 9492

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:int

var a:int? //報錯

let a:int

var a:int? //報錯

let a:int

let a:int? //報錯

總結起來就是一句話,如果變數或者常量相同,那麼就只能宣告一次。

swift中optional的變數或者常量,不能直接複製給非optional的變數或者常量,但是反過將非optional的變數或者常量,賦值給optional的變數或者常量是沒問題的:

let a: int? = 1

let 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? = 1

if a != nil

為什麼對於optional型別使用前要先監測呢?

因為如果不檢測就是用!求值,如果求出來的值是nil,會發生執行時錯誤:

var a: int?

print(a!) //發生執行時錯誤

文字解釋optional binding費勁,直接看**:

var a: int? = 1

if 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? = 1

var 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...