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

10個(gè)驚艷的Swift單行代碼

 更新時(shí)間:2016年11月14日 14:10:59   作者:wys  
這篇文章主要為大家分享了10個(gè)驚艷的Swift單行代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

幾年前,一篇表述“10個(gè)Scala函數(shù)式單行代碼”的文章非常受歡迎,并且隨后立馬出現(xiàn)了其他的語(yǔ)言版本,例如Haskell版本,Ruby版本,Groovy版本,Clojure版本,Python版本,C#版本,F(xiàn)#版本,CoffeeScript版本等。

我們不知道有多少人真的對(duì)這些單行代碼印象深刻,但我認(rèn)為,這能激勵(lì)大家去了解更多有關(guān)于函數(shù)式編程的內(nèi)容。

1 數(shù)組中的每個(gè)元素乘以2

特別簡(jiǎn)單,尤其是使用map解決的話。

(1...1024).map{$0 * 2}

2 數(shù)組中的元素求和

雖然這里使用reduce和加號(hào)運(yùn)算符,借助了加號(hào)運(yùn)算符是函數(shù)這樣一個(gè)事實(shí),但解決辦法是顯而易見(jiàn)的,我們可以看到 reduce更具創(chuàng)意的用法。

(1...1024).reduce(0,combine: +)

3 驗(yàn)證在字符串中是否存在指定單詞

讓我們使用 filter來(lái)驗(yàn)證tweet中是否包含選定的若干關(guān)鍵字中的一個(gè):

let words = ["Swift","iOS","cocoa","OSX","tvOS"]
let tweet = "This is an example tweet larking about Swift"
let valid = !words.filter({tweet.containsString($0)}).isEmpty
valid //true

更新:@oisdk提出一些更好的選擇:

words.contains(tweet.containsString)

方式更簡(jiǎn)潔,還有這一個(gè):

tweet.characters
.split(" ")
.lazy
.map(String.init)
.contains(Set(words).contains)

4 讀取文件

像其他語(yǔ)言一樣,通過(guò)簡(jiǎn)單的內(nèi)置來(lái)讀取文件到數(shù)組中是不可能,但我們可以結(jié)合使用 split 和 map創(chuàng)造一些不需要for循環(huán)的簡(jiǎn)短代碼:

let path = NSBundle.mainBundle().pathForResource("test", ofType: "txt")
let lines = try? String(contentsOfFile: path!).characters.split{$0 == "\n"}.map(String.init)
if let lines=lines {
  lines[0] // O! for a Muse of fire, that would ascend
  lines[1] // The brightest heaven of invention!
  lines[2] // A kingdom for a stage, princes to act
  lines[3] // And monarchs to behold the swelling scene.
}

map和字符串構(gòu)造函數(shù)的最后一步把我們的數(shù)組字符轉(zhuǎn)換為字符串。

5 祝你生日快樂(lè)!

這將顯示生日快樂(lè)歌到控制臺(tái),通過(guò)map以及范圍和三元運(yùn)算符的簡(jiǎn)單使用。

let name = "uraimo"
(1...4).forEach{print("Happy Birthday " + (($0 == 3) ? "dear \(name)":"to You"))}

6 過(guò)濾數(shù)組中的數(shù)字

在這種情況下,我們需要使用提供的過(guò)濾函數(shù)分區(qū)一個(gè)序列。許多語(yǔ)言除了擁有常用的map、flatMap、reduce、filter等,還有正好能做這件事的 partitionBy 函數(shù),Swift如你所知沒(méi)有類似的東西(NSPredicate提供的可以過(guò)濾的NSArray函數(shù)在這里不是我們所需要的)。

因此,我們可以用 partitionBy 函數(shù)擴(kuò)展 SequenceType 來(lái)解決這個(gè)問(wèn)題,我們將使用 partitionBy 函數(shù)來(lái)分區(qū)整型數(shù)組:

extension SequenceType{
    typealias Element = Self.Generator.Element
    func partitionBy(fu: (Element)->Bool)->([Element],[Element]){
    var first=[Element]()
    var second=[Element]()
    for el in self {
    if fu(el) {
    first.append(el)
  }else{
    second.append(el)
    }
  }
    return (first,second)
  }
}
let part = [82, 58, 76, 49, 88, 90].partitionBy{$0 < 60}
part // ([58, 49], [82, 76, 88, 90])

不是真正的單行代碼。那么,我們是否可以使用過(guò)濾器來(lái)改善它?

extension SequenceType{
  func anotherPartitionBy(fu: (Self.Generator.Element)->Bool)->([Self.Generator.Element],[Self.Generator.Element]){
    return (self.filter(fu),self.filter({!fu($0)}))
  }
}
let part2 = [82, 58, 76, 49, 88, 90].anotherPartitionBy{$0 < 60}
part2 // ([58, 49], [82, 76, 88, 90])

稍微好了一點(diǎn),但它遍歷了序列兩次,并且試圖把它變成單行代碼刪除閉包功能將會(huì)導(dǎo)致太多重復(fù)的東西(過(guò)濾函數(shù)和數(shù)組會(huì)在兩個(gè)地方使用)。

我們是否使用單個(gè)數(shù)據(jù)流建立一些能夠?qū)⒊跏夹蛄修D(zhuǎn)換為分區(qū)元組的東西?是的,我們可以用 reduce。

var part3 = [82, 58, 76, 49, 88, 90].reduce( ([],[]), combine: {
  (a:([Int],[Int]),n:Int) -> ([Int],[Int]) in
  (n<60) ? (a.0+[n],a.1) : (a.0,a.1+[n])
})
part3 // ([58, 49], [82, 76, 88, 90])

我們?cè)谶@里構(gòu)建了包含兩個(gè)分區(qū)的結(jié)果元組,一次一個(gè)元素,使用過(guò)濾函數(shù)測(cè)試初始序列中的每個(gè)元素,并根據(jù)過(guò)濾結(jié)果追加該元素到第一或第二分區(qū)數(shù)組中。

最后得到真正的單行代碼,但要注意這樣一個(gè)事實(shí),即分區(qū)數(shù)組通過(guò)追加被構(gòu)建,實(shí)際上會(huì)使其比前兩個(gè)實(shí)施方式要慢。

7 獲取并解析XML Web服務(wù)

上面的有些語(yǔ)言不依賴外部庫(kù),并默認(rèn)提供多個(gè)選項(xiàng)來(lái)處理XML(例如Scala雖然笨拙但“本地”地支持XML解析成對(duì)象),但Foundation只提供了SAX解析器NSXMLParser,并且正如你可能已經(jīng)猜到的那樣,我們不打算使用它。

有幾個(gè)替代的開(kāi)源庫(kù),我們可以在這種情況下使用,其中一些用C或Objective-C編寫(xiě),其他為純Swift。

這次,我們打算使用純Swift的AEXML:

let xmlDoc = try? AEXMLDocument(xmlData: NSData(contentsOfURL: NSURL(string:"https://www.ibiblio.org/xml/examples/shakespeare/hen_v.xml")!)!)
if let xmlDoc=xmlDoc {
  var prologue = xmlDoc.root.children[6]["PROLOGUE"]["SPEECH"]
  prologue.children[1].stringValue // Now all the youth of England are on fire,
  prologue.children[2].stringValue // And silken dalliance in the wardrobe lies:
  prologue.children[3].stringValue // Now thrive the armourers, and honour's thought
  prologue.children[4].stringValue // Reigns solely in the breast of every man:
  prologue.children[5].stringValue // They sell the pasture now to buy the horse,
}

8 在數(shù)組中查找最小(或最大)值

我們有各種方法來(lái)找到序列中的最小和最大值,其中有 minElement 和maxElement 函數(shù):

//Find the minimum of an array of Ints
[10,-22,753,55,137,-1,-279,1034,77].sort().first
[10,-22,753,55,137,-1,-279,1034,77].reduce(Int.max, combine: min)
[10,-22,753,55,137,-1,-279,1034,77].minElement()
//Find the maximum of an array of Ints
[10,-22,753,55,137,-1,-279,1034,77].sort().last
[10,-22,753,55,137,-1,-279,1034,77].reduce(Int.min, combine: max)
[10,-22,753,55,137,-1,-279,1034,77].maxElement()

9 并行處理

某些語(yǔ)言允許用一種簡(jiǎn)單和透明的方式啟用數(shù)組對(duì)功能,例如map和flatMap的并行處理,以加快順序和獨(dú)立操作的執(zhí)行。

此功能Swift中還不可用,但可以使用GCD構(gòu)建:http://moreindirection.blogspot.it/2015/07/gcd-and-parallel-collections-in-swift.html

10 埃拉托斯特尼篩法

埃拉托斯特尼篩法用于查找所有的素?cái)?shù)直到給定的上限n。

從小于n的所有整數(shù)序列開(kāi)始,算法刪除所有整數(shù)的倍數(shù),直到只剩下素?cái)?shù)。并且為了加快執(zhí)行速度,我們實(shí)際上并不需要檢查每個(gè)整數(shù)的倍數(shù),我們止步于n的平方根就可以了。

根據(jù)這一定義首次執(zhí)行可能是這樣的:

var n = 50
var primes = Set(2...n)
(2...Int(sqrt(Double(n)))).forEach{primes.subtractInPlace((2*$0).stride(through:n, by:$0))}
primes.sort()

我們使用外部范圍來(lái)迭代我們要檢查的整數(shù),并且對(duì)于每一個(gè)整數(shù)我們使用 stride(through:Int by:Int)計(jì)算出數(shù)字的倍數(shù)的序列。那些序列然后從Set中減去,Set用所有從2到n的整數(shù)初始化。

但正如你所看到的,為了實(shí)際移除倍數(shù),我們使用外部可變Set,導(dǎo)致了附帶后果。

為了消除附帶后果,正如我們通常應(yīng)該做的那樣,我們會(huì)先計(jì)算所有序列,用倍數(shù)的單一數(shù)組來(lái)flatMap它們,并從初始Set中刪除這些整數(shù)。

var sameprimes = Set(2...n)
sameprimes.subtractInPlace((2...Int(sqrt(Double(n))))
.flatMap{ (2*$0).stride(through:n, by:$0)})
sameprimes.sort()

方式更清潔,使用flatMap的一個(gè)很好的例子以生成扁平化的嵌套數(shù)組。

11 其他:通過(guò)解構(gòu)元組交換

最后一點(diǎn),并非每個(gè)人都知道的是,和其他有tuple類型的語(yǔ)言一樣,元組可以用來(lái)執(zhí)行緊湊的變量交換:

var a=1,b=2
(a,b) = (b,a)
a //2
b //1

好了,正如所料,Swift和其他語(yǔ)言一樣富有表現(xiàn)力。

你有其他想要分享的有趣的Swift單行代碼嗎?一起來(lái)聊一聊吧!

英文原文:10 Swift One Liners To Impress Your Friends

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

江油市| 抚顺市| 浙江省| 皋兰县| 茌平县| 和林格尔县| 邻水| 涟水县| 汽车| 太白县| 米易县| 察雅县| 双江| 剑河县| 泰和县| 乌兰察布市| 黄浦区| 西贡区| 莒南县| 东乡族自治县| 隆尧县| 紫金县| 彭阳县| 同江市| 吉安市| 西青区| 云霄县| 二连浩特市| 钦州市| 耿马| 抚松县| 化州市| 双桥区| 府谷县| 昭苏县| 仁寿县| 吐鲁番市| 巴林左旗| 卢湾区| 广宗县| 资中县|