Swift 可選值型別

2021-10-08 23:06:02 字數 3819 閱讀 7431

enum

optional

<

>

optional 實際上就是乙個列舉。可選值是swift中重要的基礎型別之一,所以有更加簡潔的語法來表示。例如:optional可以寫成int?

因為可選值遵守expressiblebynilliteral協議,所以可以用nil代替.none

當你看見問號的時候,實際上你就應該立刻明白,這實際上就是乙個語法糖而已。

某些方法的返回值是可選值,比如:

var numbers =[1

,3,5

,2,4

,6]let a = numbers.

first

print

("\(

type

(of: a))"

)// optional

陣列numbers呼叫first方法,返回乙個可選值型別的值,並且賦值給了a。為什麼會返回乙個可選值呢,而不是直接返回乙個 int 型別呢?因為陣列可能為空,這個方法的設計就是考慮到陣列如果為空的時候,想讓開發者更安全的做一些事情。

如何使用a這個值?你必須對可選值進行解包,才能拿到對應的值。「解包」這個詞是翻譯過來的,很形象的表達了可選值這一概念。可選值就相當於乙個「包裹」,你不知道裡面是什麼,如果你想要獲取裡面的值,就必須進行解包。

這裡有的同學會說了,我知道裡面肯定是 1 啊,因為陣列很明顯不是空的嘛!

這只是舉例,屬於特殊情況。設想一下,numbers 陣列如果是你從其他函式返回來的呢,這個函式不一定能夠成功返回乙個非空陣列吧。

我們為什麼會從乙個列舉中獲取到乙個期望的值呢,這是因為利用了 swift 中列舉可以關聯值的特性。

至此,我們明白了,a是個可選值型別,如果有值的話,我們經過解包可以獲取到值。如果沒有值,我們獲取到乙個.none(上面已經說了,可以用nil代替)。

下面是解包過程,我們獲取到 a 裡面的值,並且進行列印。

switch a
或者稍微簡潔一些:

switch a
我們用了乙個 switch 語句對可選值進行了解包操作。很簡單吧,就是用乙個 switch 語句將列舉值列了出來,然後在對應的分支上獲取到我們期望的值。

但是,每當我們遇到乙個可選值,都寫這麼多**進行解包,未免太難看了吧。沒錯,你已經想到了,如果你看過 swift 寫的**,裡面經常出現的,就是幹這個事的。又是語法糖!

現在我們可以這樣使用a(偷懶做法):

print

("\(a!)"

)

上面這種對a的解包操作叫做強制解包。如果a解包後沒有值,會發生意外退出,一般不建議這樣做,除非你確定a解包後必定有值。

常規做法:

if

let value = a

這樣寫,你就不用擔心值為空的情況了。因為只要有值,就會進入到if語句裡面。

guard

let value = a else

print

("\(value)

")

這段**,如果a為空,可以提前退出當前的函式,後續操作就可以不用繼續進行了。

上面兩種寫法,結合實際情況進行使用。

在函式式程式設計裡面,有很多好用的方法,可以一鼓作氣完成眾多操作,比如下面的三個方法。這裡只講這三個方法用在可選值的情況,其他情況後面再專門寫乙個部落格進行總結。

當你想要的就是乙個可選值的時候,map 方法就非常有用。例如:

將乙個字元陣列的首元素轉換為字串:

let characters:

[character]=

["a"

,"b"

,"c"

]var stringofa:

string?=

nilif

let value = characters.

first

還可以這樣實現:

stringofa = characters.

first

.map

print

("\(

type

(of: stringofa))"

)//optional

map方法的是這樣的:

extension

optional

return

transform

(value)

}}

有的時候,我們獲取到的是乙個可選值型別的可選值。比如:

let stringnumbers =

["1"

,"2"

,"3"

,"f"

]let *** = stringnumbers.

first

.map

print

("\(

type

(of: ***))"

)// optional>

這個時候,我們使用 flatmap,系統內部會自動轉為我們希望的 optional

let stringnumbers =

["1"

,"2"

,"3"

,"f"

]let *** = stringnumbers.

first

.flatmap

print

("\(

type

(of: ***))"

)// optional

實現方式:

extension

optional

return

nil}

}

你可能會處理乙個陣列中的元素,而這些元素經過處理後可能為空,而你只關心不為空的,比如:

let numbers1 =

["kd"

,"e"

,"3"

,"6"

]for item in numbers1

}

或者稍微優雅一點:

for

case

let value?

in numbers1.

map(

)

實際上,你可以更加優雅:

for value in numbers1.

compactmap()

再或者,你想用陣列中那些能轉換為數字的那幾個值求和:

let sum = numbers1.compactmap

.reduce(0

,+)print

("\(sum)")

// 9

注:$0代表的是閉包表示式中的第乙個引數。$1、$2表示第

二、第三個引數,以此類推。

Swift 可選型別

swift 可選型別 optionals 可選型別 強制解析 自動解析 可選繫結 1.可選型別 加入我們建立乙個變數,但是它有可能為空,這時候swift提供乙個符號 來表示這是乙個可能為空的變數 var thisstr string?看到這裡的if,沒錯,if或者for迴圈後面的內容不加 加了也沒錯...

Swift 可選型別

在 swift 中,可選型別用來處理值可能缺失的情況,表示下面兩種情況 在 swift 中宣告變數時,使用?或 來表示宣告的變數是可選型別。let name string?var age int 此時,變數name和age預設都是nil,表示空。而?和 的區別在於使用前者宣告的變數所包含的值時,需要...

swift可選隱式可選型別

可選型別 隱式可選型別 在swift中,可選魯迅個其實是乙個,列舉型別,裡面有none和some兩種型別。其實所謂的nil就是optional.none,非nil就是optional.some,然後會通過some t 包裝 wrap 原始值,這也是為什麼可選型別需要拆包的原因,也是playgroun...