亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift中使用可選類型完美解決占位問題

2020-03-09 17:50:38
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift中使用可選類型完美解決占位問題,本文講解了為Dictionary增加objectsForKeys函數、Swift中更簡便的方法、內嵌可選類型等內容,需要的朋友可以參考下
 

可選類型是Swift中新引入的,功能很強大。在這篇博文里討論的,是在Swift里,如何通過可選類型來保證強類型的安全性。作為例子,我們來創建一個Objective-C API的Swift版本,但實際上Swift本身并不需要這樣的API。

為Dictionary增加objectsForKeys函數

在Objective-C中,NSDictionary有一個方法-objectsForKeys:NoFoundMarker:, 這個方法需要一個NSArray數組作為鍵值參數,然后返回一個包含相關值的數組。文檔里寫到:"返回數組中的第N個值,和輸入數組中的第N個值相對應",那如果有某個鍵值在字典里不存在呢?于是就有了notFoundMarker作為返回提示。比如第三個鍵值沒有找到,那么在返回數組中第三個值就是這個notFoundMarker,而不是字典中的第三個值,但是這個值只是用來提醒原字典中沒有找到對應值,但在返回數組中該元素存在,且用notFoundMarker作為占位符,因為這個對象不能直接使用,所以在Foundation框架中有個專門的類處理這個情況:NSNull。

在Swift中,Dictionary類沒有類似objectsForKeys的函數,為了說明問題,我們動手加一個,并且使其成為操作字典值的通用方法。我們可以用extension來實現:

復制代碼代碼如下:

extension Dictionary{
    func valuesForKeys(keys:[K], notFoundMarker: V )->[V]{
        //具體實現代碼后面會寫到
    }
}

以上就是我們實現的Swift版本,這個和Objective-C版本有很大區別。在Swift中,因為其強類型的原因限制了返回的結果數組只能包含單一類型的元素,所以我們不能放NSNull在字符串數組中,但是,Swift有更好的選擇,我們可以返回一個可選類型數據。我們所有的值都封包在可選類型中,而不是NSNull, 我們只用nil就可以了。
復制代碼代碼如下:

extension Dictionary{
    func valuesForKeys(keys: [Key]) -> [Value?] {
        var result = [Value?]()
        result.reserveCapacity(keys.count)
        for key in keys{
            result.append(self[key])
        }
        return result
    }
}

 

Swift中更簡便的方法

小伙伴們可能會問,為什么Swift中不需要實現這么一個API呢?其實其有更簡單的實現,如下面代碼所示:

復制代碼代碼如下:

extension Dictionary {
    func valuesForKeys(keys: [Key]) -> [Value?] {
        return keys.map { self[$0] }
    }
}

上述方式實現的功能和最開始的方法實現的功能相同,雖然核心的功能是封裝了map的調用,這個例子也說明了為什么Swift沒有提供輕量級的API接口,因為小伙伴們簡單的調用map就可以實現。

 

接下來,我們實驗幾個例子:

復制代碼代碼如下:

var dic: Dictionary = [ "1": 2, "3":3, "4":5 ]

 

var t = dic.valuesForKeys(["1", "4"]) 
//結果為:[Optional(2), Optional(5)]

var t = dict.valuesForKeys(["3", "9"])
// 結果為:[Optional(3), nil]

t = dic.valuesForKeys([])
//結果為:[]

 

內嵌可選類型

現在,如果我們為每一個結果調用last方法,看下結果如何?

復制代碼代碼如下:

var dic: Dictionary = [ "1": 2, "3":3, "4":5 ]

 

var t = dic.valuesForKeys(["1", "4"]).last //結果為:Optional(Optional(5))
// Optional(Optional("Ching"))

var t = dict.valuesForKeys(["3", "9"]).last
// 結果為:Optional(nil)

var t = dict.valuesForKeys([]).last
// 結果為:nil

 

小伙伴們立馬迷糊了,為什么會出現兩層包含的可選類型呢?,特別對第二種情況的Optional(nil),這是什么節奏?

我們回過頭看看last屬性的定義:

復制代碼代碼如下:

var last:T? { get }

很明顯last屬性的類型是數組元素類型的可選類型,這種情況下,因為元素類型是(String?),那么再結合返回的類型,于是其結果就是String??了,這就是所謂的嵌套可選類型。但嵌套可選類型本質是什么意思呢?
如果在Objective-C中重新調用上述方法,我們將使用NSNull作為占位符,Objective-C的調用語法如下所示:
復制代碼代碼如下:

[dict valuesForKeys:@[@"1", @"4"] notFoundMarker:[NSNull null]].lastObject
// 5
[dict valuesForKeys:@[@"1", @"3"] notFoundMarker:[NSNull null]].lastObject
// NSNull
[dict valuesForKeys:@[] notFoundMarker:[NSNull null]].lastObject
// nil

不管是Swift版本還是Objective-C版本,返回值為nil都意味數組是空的,所以它就沒有最后一個元素。 但是如果返回是Optional(nil)或者Objective-C中的NSNull都表示數組中的最后一個元素存在,但是元素的內容是空的。在Objective-C中只能借助NSNull作為占位符來達到這個目的,但是Swift卻可以語言系統類型的角度的實現。
提供一個默認值
進一步封裝,如果我字典中的某個或某些元素不存在,我們想提供一個默認值怎么辦呢?實現方法很簡單:
復制代碼代碼如下:

extension Dictionary {
    func valuesForKeys( keys:[Key], notFoundMarker: Value)->[Value]{
        return self.valueForKeys(kes).map{ $0 ?? notFoundMarker }
    }
}
dict.valuesForKeys(["1", "5"], notFoundMarker: "Anonymous")

和Objective-C相比,其需要占位符來達到占位的目的,但是Swift卻已經從語言類型系統的層面原生的支持了這種用法,同時提供了豐富的語法功能。這就是Swift可選類型的強大之處。同時注意上述例子中用到了空合運算符??。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线不卡国产精品| 国外成人在线播放| 国产亚洲激情在线| 韩日欧美一区二区| 久久精品国产亚洲一区二区| 欧美性猛交xxxx乱大交3| 国产精品福利在线观看| 国产拍精品一二三| 91精品国产综合久久男男| 91精品久久久久久| 97视频色精品| 欧美一级免费看| 中文字幕在线观看亚洲| 国产欧美精品一区二区三区-老狼| 亚洲香蕉成人av网站在线观看| 亚洲女人天堂色在线7777| 日韩欧美亚洲范冰冰与中字| 成人精品一区二区三区电影黑人| 久久久久国产精品一区| 九九热最新视频//这里只有精品| 最新亚洲国产精品| 欧美精品18videos性欧美| 欧美一级片久久久久久久| 欧美理论电影在线观看| 成人黄色短视频在线观看| 超碰91人人草人人干| 欧美剧在线观看| 国产精品免费视频久久久| 欧美日韩999| 久久精品国产视频| 久久久国产精品视频| 欧美专区在线观看| 亚洲乱码国产乱码精品精| 97超级碰在线看视频免费在线看| 一本久久综合亚洲鲁鲁| 亚洲aⅴ男人的天堂在线观看| 久久久久久久久国产精品| 日韩成人av网址| 在线精品高清中文字幕| 精品无人国产偷自产在线| 精品久久久久久久久久ntr影视| 欧美中文字幕在线视频| www.久久久久| 中文字幕日韩欧美在线| 国产精品久久久久久久9999| 欧美大片大片在线播放| 夜夜躁日日躁狠狠久久88av| 91av在线网站| 91社区国产高清| 久久精视频免费在线久久完整在线看| 日韩经典中文字幕在线观看| 国产精品久久久久高潮| 日本不卡视频在线播放| 国产91成人video| 九九热这里只有精品免费看| 少妇高潮久久77777| 亚洲成人精品视频| 亚洲天堂av在线免费| 免费91麻豆精品国产自产在线观看| 美女国内精品自产拍在线播放| 欧美性高跟鞋xxxxhd| 日本欧美中文字幕| 91影视免费在线观看| 亚洲国产欧美自拍| 国产精品自产拍高潮在线观看| 国产在线观看不卡| 欧美刺激性大交免费视频| 中文字幕久热精品在线视频| 亚洲精品成人久久| 久久久久久久久中文字幕| 亚洲精品国产精品国产自| 国产精品国产三级国产专播精品人| 在线一区二区日韩| 懂色aⅴ精品一区二区三区蜜月| 欧美日韩综合视频网址| 91网在线免费观看| 国产手机视频精品| 国内精品小视频在线观看| 亚洲美女黄色片| 亚洲黄色有码视频| 欧美人成在线视频| 精品亚洲va在线va天堂资源站| 精品国偷自产在线视频99| 国产日产久久高清欧美一区| 国产亚洲欧美另类中文| 日本高清不卡的在线| 国产精品流白浆视频| 亚洲白虎美女被爆操| 久久国产精品久久国产精品| 成人欧美一区二区三区黑人孕妇| 亚洲第一视频在线观看| 97国产精品视频| 另类天堂视频在线观看| 亚洲免费影视第一页| 伊人伊人伊人久久| 欧美一区二区大胆人体摄影专业网站| 91久久精品国产91性色| 青青在线视频一区二区三区| 国产精品网红直播| 欧美精品一区三区| 91情侣偷在线精品国产| 懂色av一区二区三区| 国产不卡av在线| 日韩精品在线视频观看| 中文字幕亚洲一区二区三区| 国产精品高潮粉嫩av| 国产精品亚洲第一区| 精品国产一区av| 久久精品一偷一偷国产| 久久久亚洲国产| 国产精品久久久久久久7电影| 成人免费网视频| 亚洲第一免费播放区| 久久99精品视频一区97| 精品国产一区二区在线| 国产欧美亚洲视频| 国产97人人超碰caoprom| 亚洲欧美制服综合另类| 国产精品久久久久久久久久久久| 日韩综合中文字幕| 日本不卡免费高清视频| 欧美精品国产精品日韩精品| 欧洲成人在线观看| 欧美人在线观看| 日韩va亚洲va欧洲va国产| 欧美有码在线观看| 日韩精品有码在线观看| 国产精品久久精品| 久久99精品久久久久久噜噜| 欧美亚洲国产日本| 精品无人区乱码1区2区3区在线| 国产91色在线|免| 日韩美女免费观看| 亚洲自拍偷拍在线| 亚洲美女动态图120秒| 国产美女91呻吟求| 久久亚洲欧美日韩精品专区| 日韩精品极品在线观看| 欧美日产国产成人免费图片| 播播国产欧美激情| 亚洲另类激情图| 日韩在线观看你懂的| 久久人91精品久久久久久不卡| 国产日本欧美视频| 4438全国成人免费| 国产精品18久久久久久麻辣| 成人网在线观看| 欧美精品在线第一页| 亚洲男人天堂古典| 美女福利精品视频| 色综合影院在线| 2019中文字幕在线免费观看| 久久天堂av综合合色| 国产精品久久久久久久久久久新郎| 91日本在线观看| 国产日韩欧美综合| 中文字幕一区日韩电影| 亚洲欧美精品在线| 成人情趣片在线观看免费| 国产丝袜一区二区三区| 自拍视频国产精品| 欧美亚洲日本网站| 欧美日韩免费网站| 色妞欧美日韩在线|