Swift Map方法

CollectionType Map

CollectionType的extension中map方法的定義:

extension CollectionType {
    /// Return an `Array` containing the results of mapping `transform`
    /// over `self`.
    ///
    /// - Complexity: O(N).
    @warn_unused_result
    @rethrows public func map<T>(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T]
    ...
}

@warn_unused_result:表示如果沒(méi)有檢查或者使用該方法的返回值型诚,編譯器就會(huì)報(bào)警告官边。

@noescape:用在函數(shù)的閉包參數(shù)上瓶竭,意味著這個(gè)參數(shù)是唯一可被調(diào)用的(或者用在函數(shù)調(diào)用時(shí)以參數(shù)的方式出現(xiàn)),其意思是它的生命周期比函數(shù)調(diào)用的周期短洛搀,這有助于一些小小的性能優(yōu)化,但最重要的是它屏蔽了閉包中對(duì)self.的需求佑淀。這使得函數(shù)的控制流比其他更加透明留美。

throws:可以拋出一個(gè)錯(cuò)誤的函數(shù)或方法必需使用 throws 關(guān)鍵字標(biāo)記。這些函數(shù)和方法被稱(chēng)為拋出異常函數(shù)(throwing fu nctions)和拋出異常方法(throwing methods)伸刃。

rethrows:一個(gè)函數(shù)或方法可以使用 rethrows 關(guān)鍵字來(lái)聲明,從而表明僅當(dāng)這個(gè)函數(shù)或方法的一個(gè)函數(shù)參數(shù)拋出錯(cuò)誤時(shí)這個(gè)函數(shù)或方法才拋出錯(cuò)誤谎砾。這些函數(shù)和方法被稱(chēng)為重拋出異常函數(shù)(rethrowing functions)和重拋出異常方法(rethrowing methods)。重拋出異常函數(shù)或方法必需有至少一個(gè)拋出異常函數(shù)參數(shù)捧颅。

Generator:提到數(shù)組我們就會(huì)想到遍歷景图,一般的遍歷可能都是從頭到尾進(jìn)行的。但是如果你有特殊的需求呢碉哑。你可能不想呆板的進(jìn)行遍歷挚币。這時(shí)候Generators就可以派上用場(chǎng)了。Generators的存在是進(jìn)行特殊癖好的數(shù)組遍歷扣典,其篩選出符合該癖好的下標(biāo)索引到數(shù)組沒(méi)有元素為止妆毕。Self.Generator.Element就是在遍歷的元素。

簡(jiǎn)化一下map的定義:

func map<T>(transform: (Self.Generator.Element) -> T) -> [T]

可以看到激捏,map 方法返回的是一個(gè)數(shù)組设塔,其獲取一個(gè)閉包表達(dá)式作為唯一參數(shù),集合中的每個(gè)元素調(diào)用一次該閉包函數(shù)远舅,并返回該元素所映射的值(也可以是不同類(lèi)型的值)闰蛔。具體的映射方式和返回值類(lèi)型由閉包來(lái)指定。

看幾個(gè)簡(jiǎn)單例子:

// 例子1:對(duì)一個(gè)Int類(lèi)型數(shù)組的元素進(jìn)行2倍放大图柏。如:[1,2,3]->[2,4,6]序六。
let arr = [1,2,3]
let doubled = arr.map{
  $0 * 2
}
print(doubled)
// 輸出:[2,4,6]
// 例子2:用一個(gè)Int類(lèi)型數(shù)組存儲(chǔ)商品金額,想把每個(gè)金額后面添加一個(gè)字符“¥”蚤吹,把數(shù)組轉(zhuǎn)成字符串?dāng)?shù)組例诀。如:[10,20,30,40] -> ["10¥","20¥","30¥","40¥"]
let moneyArray = [10,20,30,40]
let stringsArray = moneyArray.map{
    "\($0)¥"
}
print(stringsArray)
// 輸出:["10¥","20¥","30¥","40¥"]
// 例子3: 將Int類(lèi)型數(shù)組轉(zhuǎn)換為包含對(duì)應(yīng)String類(lèi)型的數(shù)随抠。如:[16,58,510] -> ["OneSix", "FiveEight", "FiveOneZero"]。
let digitNames = [
                  0: "Zero",1: "One", 2: "Two",3: "Three", 4: "Four",
                  5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
                 ]
let numbers = [16, 58, 510]

let strings = numbers.map{
    (var number) -> String in
    var output = ""
    while number > 0 {
        output = digitNames[number % 10]! + output
        number /= 10
    }
    return output
}
print(strings)
// 輸出:["OneSix", "FiveEight", "FiveOneZero"]

想要了解更多map,看這里Why coding like This ------ Map 函數(shù)揭秘

Optional Map

以下內(nèi)容出自《Swifter》

假設(shè)要將某個(gè)Int?乘以2繁涂,一個(gè)合理的策略是如果這個(gè)Int?有值的話拱她,就取出值進(jìn)行乘以2的操作,如果是nil賦給結(jié)果扔罪。代碼如下:

let num: Int? = 3
var result: Int?
if let realNum = num {
    result = realNum * 2
} else {
    result = nil
}

其實(shí)我們有更優(yōu)雅簡(jiǎn)潔的方式秉沼,那就是使用Optionalmap。對(duì)的矿酵,不僅僅在Array或者說(shuō)CollectionType里可以用map唬复,如果我們仔細(xì)看過(guò)Optional的聲明的話,會(huì)發(fā)現(xiàn)它也有一個(gè)map方式:

public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible {
    ...
    /// If `self == nil`, returns `nil`.  Otherwise, returns `f(self!)`.
    @warn_unused_result
    @rethrows public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U?
    ...
}

這個(gè)方法能讓給我們很方便的對(duì)一個(gè)Optional值做變化和操作全肮,而不必進(jìn)行手動(dòng)的解包工作敞咧。輸入會(huì)被自動(dòng)用類(lèi)似Optional Binding的方式進(jìn)行判斷,如果有值辜腺,則進(jìn)入f的閉包進(jìn)行變化休建,并返回一個(gè)U?;如果輸入就是nil的話,則直接返回nilU?评疗。

有了這個(gè)方法丰包,上面的代碼就可以大大簡(jiǎn)化,而且result甚至可以使用常量值:

let num: Int? = 3
let result = num.map{
    $0 * 2
}
// result 為 {Some 6}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壤巷,一起剝皮案震驚了整個(gè)濱河市邑彪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胧华,老刑警劉巖寄症,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異矩动,居然都是意外死亡有巧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)悲没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)篮迎,“玉大人,你說(shuō)我怎么就攤上這事示姿√鸪鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵栈戳,是天一觀的道長(zhǎng)岂傲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)子檀,這世上最難降的妖魔是什么镊掖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任乃戈,我火速辦了婚禮,結(jié)果婚禮上亩进,老公的妹妹穿的比我還像新娘症虑。我一直安慰自己,他們只是感情好归薛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布侦讨。 她就那樣靜靜地躺著,像睡著了一般苟翻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骗污,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天崇猫,我揣著相機(jī)與錄音,去河邊找鬼需忿。 笑死诅炉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屋厘。 我是一名探鬼主播涕烧,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汗洒!你這毒婦竟也來(lái)了议纯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溢谤,失蹤者是張志新(化名)和其女友劉穎瞻凤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體世杀,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阀参,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞻坝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛壳。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖所刀,靈堂內(nèi)的尸體忽然破棺而出衙荐,到底是詐尸還是另有隱情,我是刑警寧澤浮创,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布赫模,位于F島的核電站,受9級(jí)特大地震影響蒸矛,放射性物質(zhì)發(fā)生泄漏瀑罗。R本人自食惡果不足惜胸嘴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斩祭。 院中可真熱鬧劣像,春花似錦、人聲如沸摧玫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诬像。三九已至屋群,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坏挠,已是汗流浹背芍躏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留降狠,地道東北人对竣。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像榜配,于是被迫代替她去往敵國(guó)和親否纬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • //Clojure入門(mén)教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,634評(píng)論 0 7
  • 一蛋褥、數(shù)組中的 map 和 flatMap 數(shù)組中的 map 對(duì)數(shù)組元素進(jìn)行某種規(guī)則的轉(zhuǎn)換临燃,例如: 二、 flatM...
    kmplayer閱讀 4,006評(píng)論 0 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理烙心,服務(wù)發(fā)現(xiàn)谬俄,斷路器,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • Java8 in action 沒(méi)有共享的可變數(shù)據(jù)弃理,將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說(shuō)的函數(shù)式...
    鐵牛很鐵閱讀 1,223評(píng)論 1 2
  • 初見(jiàn)swift 打印‘hello world' print("hello world"); 教程 類(lèi)型 基礎(chǔ)類(lèi)型:...
    PanPan1127閱讀 853評(píng)論 0 2