最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年05月25日 11:12:46   投稿:junjie  
這篇文章主要介紹了Swift中使用可選類型完美解決占位問題,本文講解了為Dictionary增加objectsForKeys函數(shù)、Swift中更簡便的方法、內嵌可選類型等內容,需要的朋友可以參考下

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

為Dictionary增加objectsForKeys函數(shù)

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

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

復制代碼 代碼如下:

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

以上就是我們實現(xiàn)的Swift版本,這個和Objective-C版本有很大區(qū)別。在Swift中,因為其強類型的原因限制了返回的結果數(shù)組只能包含單一類型的元素,所以我們不能放NSNull在字符串數(shù)組中,但是,Swift有更好的選擇,我們可以返回一個可選類型數(shù)據(jù)。我們所有的值都封包在可選類型中,而不是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中不需要實現(xiàn)這么一個API呢?其實其有更簡單的實現(xiàn),如下面代碼所示:

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

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([])
//結果為:[]

內嵌可選類型

現(xiàn)在,如果我們?yōu)槊恳粋€結果調用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

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

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

復制代碼 代碼如下:

var last:T? { get }

很明顯last屬性的類型是數(shù)組元素類型的可選類型,這種情況下,因為元素類型是(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都意味數(shù)組是空的,所以它就沒有最后一個元素。 但是如果返回是Optional(nil)或者Objective-C中的NSNull都表示數(shù)組中的最后一個元素存在,但是元素的內容是空的。在Objective-C中只能借助NSNull作為占位符來達到這個目的,但是Swift卻可以語言系統(tǒng)類型的角度的實現(xiàn)。
提供一個默認值
進一步封裝,如果我字典中的某個或某些元素不存在,我們想提供一個默認值怎么辦呢?實現(xiàn)方法很簡單:
復制代碼 代碼如下:

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卻已經(jīng)從語言類型系統(tǒng)的層面原生的支持了這種用法,同時提供了豐富的語法功能。這就是Swift可選類型的強大之處。同時注意上述例子中用到了空合運算符??。

相關文章

  • 在Swift中如何使用正則表達式詳解

    在Swift中如何使用正則表達式詳解

    正則表達式是對字符串操作的一種邏輯公式,相信大家應該都不陌生,下面這篇文章主要給大家介紹了關于在Swift中如何使用正則表達式的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • Swift函數(shù)提前返回實例詳解

    Swift函數(shù)提前返回實例詳解

    函數(shù)相當重要的,下面這篇文章主要給大家介紹了關于Swift函數(shù)提前返回的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • mac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時,出現(xiàn)了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助
    2014-09-09
  • Swift實現(xiàn)簡單計算器

    Swift實現(xiàn)簡單計算器

    這篇文章主要為大家詳細介紹了Swift實現(xiàn)簡單計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift中初始化init的方法小結

    Swift中初始化init的方法小結

    Swift有著超級嚴格的初始化方法,不僅強化了designated初始化方法的地位,所有不加修飾的init方法都需要在方法中確保非Optional的實例變量被賦值初始化,下面這篇文章主要給大家介紹了關于Swift中初始化init的相關資料,需要的朋友可以參考下。
    2018-04-04
  • swift自定義表格控件(UITableView)

    swift自定義表格控件(UITableView)

    這篇文章主要為大家詳細介紹了swift自定義表格控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 因為一個Crash引發(fā)對Swift構造器的思考分析

    因為一個Crash引發(fā)對Swift構造器的思考分析

    這篇文章主要給大家介紹了關于因為一個Crash引發(fā)對Swift構造器的思考分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Swift具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-10-10
  • iOS UITableView展開縮放動畫實例代碼

    iOS UITableView展開縮放動畫實例代碼

    這篇文章主要介紹了Swift UITableView展開縮放動畫實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Swift開發(fā)之使用UIRefreshControl實現(xiàn)下拉刷新數(shù)據(jù)及uirefreshcontrol使用

    Swift開發(fā)之使用UIRefreshControl實現(xiàn)下拉刷新數(shù)據(jù)及uirefreshcontrol使用

    本文給大家介紹使用UIRefreshControl實現(xiàn)下拉刷新數(shù)據(jù),及UIRefreshControl的使用步驟,對本文感興趣的朋友一起學習吧
    2015-11-11
  • Swift中的高階函數(shù)功能作用示例詳解

    Swift中的高階函數(shù)功能作用示例詳解

    這篇文章主要為大家介紹了Swift中的高階函數(shù)功能作用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

大冶市| 阜南县| 虎林市| 行唐县| 江陵县| 日照市| 金平| 文山县| 鄢陵县| 安义县| 思南县| 随州市| 蒙阴县| 镇江市| 鹿泉市| 手机| 唐河县| 北流市| 望江县| 桐梓县| 松桃| 濮阳县| 平山县| 北安市| 云南省| 米泉市| 修文县| 焦作市| 攀枝花市| 涟源市| 洛阳市| 东山县| 抚宁县| 宜章县| 浪卡子县| 望江县| 新余市| 衡东县| 枣强县| 随州市| 三原县|