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