在swift中,map和flatmap在處理可選型別的操作上非常好用,下面就以map舉例
常規來說,我們來處理乙個可選的int值的時候,通常以下方式來處理
var num1: int? = 10var num2 = (num1 != nil) ? (num1! + 10) : nil
對於map函式來說。就可以用下面**的方式:
var num1: int? = 10var num3 = num1.map
兩者的列印結果如下:
var num1: int? = 10var num2 = (num1 != nil) ? (num1! + 10
) : nil
var num3 = num1.map
print(num2)
print(num3)
//optional(20)
//optional(20)
從列印結果來說,兩者的效果是等價的,可以說map函式非常方便
而swift中的map和flatmap效果基本上是等效,下面是兩者比較的**
var num1: int? =nilvar num2 = num1.map
var num0 = num1.flatmap
print(num2)
print(num0)
var num3: int? = 20
var num4 = num3.map
var num5 = num3.flatmap
print(num4)
print(num5)
列印結果如下:
nilniloptional(40)
optional(
40)
從列印結果來說,兩個函式的列印結果是相同,也就是等價於效果是等效的
差異的地方對面下面函式的列印結果:
//分別在函式傳入的閉包中,再加上乙個可選的盒子
var num1: int? = 10
var num2 = num1.map
var num3 = num1.flatmap
print(num2)
print(num3)
列印結果如下:
optional(optional(20))optional(
20)
對比可知,flatmap的輸出結果的時候,會只剩餘乙個可選項的包裝層
檢視官方文件的方法注釋如下:
///evaluates the given closure when this `optional` instance is not `nil`,
///在取被給與的閉包中乙個可選並不為空的例項的的值時
//////
傳遞開啟的值作為乙個引數
///use the `map` method with a closure that returns a non-optional value.
///此時使用map方式會返回乙個不可選的值
/////
evaluates the given closure when this `optional` instance is not `nil`,
//////
///use the `flatmap` method with a closure that returns an optional value.
///此時使用map方式會返回乙個可選的值
//
對比可知,區別在於flagmap最後會對返回值進行解包,所以會導致上面列印結果的區別
Swift 和?的使用
swift語言使用var定義變數,但是和別的語言不同,swift不會自動給變數賦初始值,也就是申明的變數不會有預設值,所以要求在使用之前不要對其初始化。如果在變數使用之前木有初始化就會報錯 var mystring string print mystring program ended with e...
好用的函式sign和decode
今天遇到了乙個問題,需要對比乙個欄位和5的大小,大於5的輸出0,小於五的輸出1。如果是用plsql程式設計的話可以用if else這種邏輯進行判斷,但是在sql裡可不能這麼寫,經過推薦,我組合使用了sign和decode,效果很好,小清新。如下 decode sign trunc col1 col2...
好用的函式sign和decode
今天遇到了乙個問題,需要對比乙個欄位和5的大小,大於5的輸出0,小於五的輸出1。如果是用plsql程式設計的話可以用if else這種邏輯進行判斷,但是在sql裡可不能這麼寫,經過推薦,我組合使用了sign和decode,效果很好,小清新。如下 decode sign trunc col1 col2...