欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift中使用可選類型完美解決占位問(wèn)題

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

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

為Dictionary增加objectsForKeys函數(shù)

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

在Swift中,Dictionary類沒(méi)有類似objectsForKeys的函數(shù),為了說(shuō)明問(wèn)題,我們動(dòng)手加一個(gè),并且使其成為操作字典值的通用方法。我們可以用extension來(lái)實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

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

以上就是我們實(shí)現(xiàn)的Swift版本,這個(gè)和Objective-C版本有很大區(qū)別。在Swift中,因?yàn)槠鋸?qiáng)類型的原因限制了返回的結(jié)果數(shù)組只能包含單一類型的元素,所以我們不能放NSNull在字符串?dāng)?shù)組中,但是,Swift有更好的選擇,我們可以返回一個(gè)可選類型數(shù)據(jù)。我們所有的值都封包在可選類型中,而不是NSNull, 我們只用nil就可以了。
復(fù)制代碼 代碼如下:

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中更簡(jiǎn)便的方法

小伙伴們可能會(huì)問(wèn),為什么Swift中不需要實(shí)現(xiàn)這么一個(gè)API呢?其實(shí)其有更簡(jiǎn)單的實(shí)現(xiàn),如下面代碼所示:

復(fù)制代碼 代碼如下:

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

上述方式實(shí)現(xiàn)的功能和最開(kāi)始的方法實(shí)現(xiàn)的功能相同,雖然核心的功能是封裝了map的調(diào)用,這個(gè)例子也說(shuō)明了為什么Swift沒(méi)有提供輕量級(jí)的API接口,因?yàn)樾』锇閭兒?jiǎn)單的調(diào)用map就可以實(shí)現(xiàn)。

接下來(lái),我們實(shí)驗(yàn)幾個(gè)例子:

復(fù)制代碼 代碼如下:

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

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

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

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

內(nèi)嵌可選類型

現(xiàn)在,如果我們?yōu)槊恳粋€(gè)結(jié)果調(diào)用last方法,看下結(jié)果如何?

復(fù)制代碼 代碼如下:

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

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

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

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

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

我們回過(guò)頭看看last屬性的定義:

復(fù)制代碼 代碼如下:

var last:T? { get }

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

[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ù)組是空的,所以它就沒(méi)有最后一個(gè)元素。 但是如果返回是Optional(nil)或者Objective-C中的NSNull都表示數(shù)組中的最后一個(gè)元素存在,但是元素的內(nèi)容是空的。在Objective-C中只能借助NSNull作為占位符來(lái)達(dá)到這個(gè)目的,但是Swift卻可以語(yǔ)言系統(tǒng)類型的角度的實(shí)現(xiàn)。
提供一個(gè)默認(rèn)值
進(jìn)一步封裝,如果我字典中的某個(gè)或某些元素不存在,我們想提供一個(gè)默認(rèn)值怎么辦呢?實(shí)現(xiàn)方法很簡(jiǎn)單:
復(fù)制代碼 代碼如下:

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

和Objective-C相比,其需要占位符來(lái)達(dá)到占位的目的,但是Swift卻已經(jīng)從語(yǔ)言類型系統(tǒng)的層面原生的支持了這種用法,同時(shí)提供了豐富的語(yǔ)法功能。這就是Swift可選類型的強(qiáng)大之處。同時(shí)注意上述例子中用到了空合運(yùn)算符??。

相關(guān)文章

  • Swift如何優(yōu)雅的進(jìn)行解包

    Swift如何優(yōu)雅的進(jìn)行解包

    這篇文章主要介紹了Swift優(yōu)雅的進(jìn)行解包,對(duì)swift感興趣的同學(xué),可以參考下
    2021-04-04
  • Swift中添加雙擊手勢(shì)識(shí)別器

    Swift中添加雙擊手勢(shì)識(shí)別器

    在這次IOS應(yīng)用開(kāi)發(fā)教程中,我們打算實(shí)現(xiàn)手勢(shì)識(shí)別。正如你所知道的,IOS支持大量的手勢(shì)操作,它們能提供了很好的應(yīng)用控制和出色用戶體驗(yàn)。
    2019-08-08
  • EvenLoop模型在iOS的RunLoop應(yīng)用示例

    EvenLoop模型在iOS的RunLoop應(yīng)用示例

    這篇文章主要為大家介紹了EvenLoop模型在iOS的RunLoop應(yīng)用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • swift在IOS應(yīng)用圖標(biāo)上添加提醒個(gè)數(shù)的方法

    swift在IOS應(yīng)用圖標(biāo)上添加提醒個(gè)數(shù)的方法

    本文是通過(guò)swift語(yǔ)言實(shí)現(xiàn)在應(yīng)用圖標(biāo)右上角添加消息個(gè)數(shù)提醒的功能,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-08-08
  • Swift心得筆記之集合類型

    Swift心得筆記之集合類型

    本文為大家講解的是swift語(yǔ)言中的集合類型數(shù)據(jù),這是swift開(kāi)發(fā)必須掌握的知識(shí)點(diǎn),感興趣的同學(xué)參考下。
    2015-04-04
  • Swift中定義單例的方法實(shí)例

    Swift中定義單例的方法實(shí)例

    Swift中單例的寫(xiě)法有很多種,下面這篇文章主要給大家介紹了關(guān)于Swift中定義單例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Swift教程之閉包詳解

    Swift教程之閉包詳解

    這篇文章主要介紹了Swift教程之閉包詳解,閉包可以在上下文的范圍內(nèi)捕獲、存儲(chǔ)任何被定義的常量和變量引用,因這些常量和變量的封閉性,而命名為“閉包(Closures)”,需要的朋友可以參考下
    2015-01-01
  • iOS開(kāi)發(fā)中Swift 指紋驗(yàn)證功能模塊實(shí)例代碼

    iOS開(kāi)發(fā)中Swift 指紋驗(yàn)證功能模塊實(shí)例代碼

    本文給大家分享ios調(diào)用touchid代碼塊,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下把
    2017-03-03
  • Swift?Error的處理方法說(shuō)明

    Swift?Error的處理方法說(shuō)明

    wift?是一個(gè)類型嚴(yán)格的語(yǔ)言,在很多情況下各種不匹配或者強(qiáng)制解包出錯(cuò)都會(huì)導(dǎo)致系統(tǒng)崩潰。所以我們需要進(jìn)行異常處理,在swift中也叫錯(cuò)誤處理Error
    2022-08-08
  • Swift并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)使用詳解

    Swift并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)使用詳解

    這篇文章主要為大家介紹了Swift并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論