10个惊艳的Swift单行代码_Swift

几年前,一篇表述“10个Scala函数式单行代码”的文章非常受欢迎,并且随后立马出现了其他的语言版本,例如Haskell版本,Ruby版本,Groovy版本,Clojure版本,Python版本,C#版本,F#版本,CoffeeScript版本等。

我们不知道有多少人真的对这些单行代码印象深刻,但我认为,这能激励大家去了解更多有关于函数式编程的内容。

1 数组中的每个元素乘以2

特别简单,尤其是使用map解决的话。

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

2 数组中的元素求和

虽然这里使用reduce和加号运算符,借助了加号运算符是函数这样一个事实,但解决办法是显而易见的,我们可以看到 reduce更具创意的用法。

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

3 验证在字符串中是否存在指定单词

让我们使用 filter来验证tweet中是否包含选定的若干关键字中的一个:

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)

方式更简洁,还有这一个:

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

4 读取文件

像其他语言一样,通过简单的内置来读取文件到数组中是不可能,但我们可以结合使用 split 和 map创造一些不需要for循环的简短代码:

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和字符串构造函数的最后一步把我们的数组字符转换为字符串。

5 祝你生日快乐!

这将显示生日快乐歌到控制台,通过map以及范围和三元运算符的简单使用。

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

6 过滤数组中的数字

在这种情况下,我们需要使用提供的过滤函数分区一个序列。许多语言除了拥有常用的map、flatMap、reduce、filter等,还有正好能做这件事的 partitionBy 函数,Swift如你所知没有类似的东西(NSPredicate提供的可以过滤的NSArray函数在这里不是我们所需要的)。

因此,我们可以用 partitionBy 函数扩展 SequenceType 来解决这个问题,我们将使用 partitionBy 函数来分区整型数组:

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])

不是真正的单行代码。那么,我们是否可以使用过滤器来改善它?

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])

稍微好了一点,但它遍历了序列两次,并且试图把它变成单行代码删除闭包功能将会导致太多重复的东西(过滤函数和数组会在两个地方使用)。

我们是否使用单个数据流建立一些能够将初始序列转换为分区元组的东西?是的,我们可以用 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])

我们在这里构建了包含两个分区的结果元组,一次一个元素,使用过滤函数测试初始序列中的每个元素,并根据过滤结果追加该元素到第一或第二分区数组中。

最后得到真正的单行代码,但要注意这样一个事实,即分区数组通过追加被构建,实际上会使其比前两个实施方式要慢。

7 获取并解析XML Web服务

上面的有些语言不依赖外部库,并默认提供多个选项来处理XML(例如Scala虽然笨拙但“本地”地支持XML解析成对象),但Foundation只提供了SAX解析器NSXMLParser,并且正如你可能已经猜到的那样,我们不打算使用它。

有几个替代的开源库,我们可以在这种情况下使用,其中一些用C或Objective-C编写,其他为纯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 在数组中查找最小(或最大)值

我们有各种方法来找到序列中的最小和最大值,其中有 minElement 和maxElement 函数:

//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 并行处理

某些语言允许用一种简单和透明的方式启用数组对功能,例如map和flatMap的并行处理,以加快顺序和独立操作的执行。

此功能Swift中还不可用,但可以使用GCD构建:http://moreindirection.blogspot.it/2015/07/gcd-and-parallel-collections-in-swift.html

10 埃拉托斯特尼筛法

埃拉托斯特尼筛法用于查找所有的素数直到给定的上限n。

从小于n的所有整数序列开始,算法删除所有整数的倍数,直到只剩下素数。并且为了加快执行速度,我们实际上并不需要检查每个整数的倍数,我们止步于n的平方根就可以了。

根据这一定义首次执行可能是这样的:

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()

我们使用外部范围来迭代我们要检查的整数,并且对于每一个整数我们使用 stride(through:Int by:Int)计算出数字的倍数的序列。那些序列然后从Set中减去,Set用所有从2到n的整数初始化。

但正如你所看到的,为了实际移除倍数,我们使用外部可变Set,导致了附带后果。

为了消除附带后果,正如我们通常应该做的那样,我们会先计算所有序列,用倍数的单一数组来flatMap它们,并从初始Set中删除这些整数。

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

方式更清洁,使用flatMap的一个很好的例子以生成扁平化的嵌套数组。

11 其他:通过解构元组交换

最后一点,并非每个人都知道的是,和其他有tuple类型的语言一样,元组可以用来执行紧凑的变量交换:

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

好了,正如所料,Swift和其他语言一样富有表现力。

你有其他想要分享的有趣的Swift单行代码吗?一起来聊一聊吧!

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索swift
单行代码
pos机收单行代码大全、收单行代码查询、pos机收单行代码查询、pos收单行代码、收单行代码,以便于您获取更多的相关知识。

时间: 2024-11-02 18:01:47

10个惊艳的Swift单行代码_Swift的相关文章

10个惊艳的 CoffeeScript 单行代码

10个惊艳的 CoffeeScript 单行代码 你可能已经读过Marcus Kazmierczak博客中的<10 Scala One Liners to Impress Your Friends>.虽然我不懂Scala(以及Java),但是它看上去真心不错,所以我决定也要惊艳我的朋友一番--人家从Java到Scala,我从Javascript到CoffeeScript.假设所有例子使用node.js作为环境. [译者注]:译者对CoffeeScript不太了解,只是觉得这种单行代码还挺有艺术

10 个惊艳的 Ruby 单行代码

10 个惊艳的 Ruby 单行代码 有人想出了Scala的10个单行代码例子.然后CoffeeScript版本迅速崛起,于是我想到发布一个Ruby版本的.我觉得Ruby的语法比Scala清洁点,虽然实质上(至少就这些例子来说)是比较相似的. 1.数组中的每个元素乘以2 (1..10).map { |n| n * 2 } 2.数组中的元素求和 (1..1000).inject { |sum, n| sum + n } 或使用(内置的)Symbol#to_proc语法,自Ruby 1.8.7之后可用

10 个惊艳的 CoffeeScript 单行代码

可能已经读过Marcus Kazmierczak博客中的<10 Scala One Liners to Impress Your Friends>.虽然我不懂Scala(以及Java),但是它看上去真心不错,所以我决定也要惊艳我的朋友一番--人家从Java到Scala,我从Javascript到CoffeeScript.假设所有例子使用node.js作为环境. [译者注]:译者对CoffeeScript不太了解,只是觉得这种单行代码还挺有艺术感的,于是粗糙地翻译出来分享给大家,有不对的地方还请

10个惊艳的Ruby单行代码

有人想出了Scala的10个单行代码例子.然后CoffeeScript版本迅速崛起,于是我想到发布一个Ruby版本的.我觉得Ruby的语法比Scala清洁点,虽然实质上(至少就这些例子来说)是比较相似的. 1.数组中的每个元素乘以2 (1..10).map { |n| n * 2 }  2.数组中的元素求和 (1..1000).inject { |sum, n| sum + n }  或使用(内置的)Symbol#to_proc语法,自Ruby 1.8.7之后可用: (1..1000).inje

福特获利超预期令华尔街惊艳股价劲扬逾10%

中新网11月3日电美国福特汽车周一令华尔街"惊艳",不但第3季交出高于市场预期的获利数字,还宣布将2011年财测调高为"获利坚稳".受此支撑,周一美股早盘,福特股价劲扬逾一成. 据台湾<工商时报>引述外电报道,福特是今年美国汽车生产大厂中唯一未宣告破产者.该公司因削减成本发挥效益,以及北美与其它主要市场的市占率提高,于第3季交出转亏为盈的亮丽财报. 福特公布,第3季获利9.97亿美元或每股29美分,远优于去年同期的亏损1.61亿美元或每股7美分.该公司的

20款效果惊艳的产品宣传网站

  比起纯粹的商务网站,设计师会更青睐允许自由发挥创意的项目.从网页设计的角度上来说,"普通"的网站也正是需要借助创意来脱颖而出,尤其是产品宣传网站,更是有足够的空间来供设计师来发挥他们的狂拽酷炫的创意.实际上如果你正在寻求网站设计创意灵感的话,那么这些宣传网站正是你需要的. 接下来我们要推荐的20个宣传网站中,既有精致的产品宣传页,也有氛围营造得恰如其分的活动宣传页,还有几个创意爆棚的个人宣传网站.这些网站无一不是设计精美的典范,更重要的是其中包含了设计师精心设计的交互和动效.如果你

从未如此惊艳!你好,SuperTextView

[引自CoorChice的博客]简介 欢迎使用SuperTextView,这篇文档将会向你展示如何使用这个控件来提高你构建项目的效率. SuperTextView继承自TextView,它能够大量的减少布局的复杂程度,并且使得一些常见的效果变得十分容易实现且高效.同时,它内置了动画驱动,你只需要合理编写Adjuster,然后startAnim()就可以看到预期的动画效果.它仅仅是一个控件,所以你可以不费吹灰之力的在你的项目中集成使用. 特点 你从此不必再为背景图编写和管理大量<shape>文件

Photoshop打造美女咖啡惊艳图片(2)

Photoshop打造美女咖啡惊艳图片5:左上向右下一拉,画布如图.急....我的蒙板为什么不起作用?可能有人会这样问.前后对比,错在那里大家应该知道了吧. 7:BB一直相信:作图是讲究天赋的.没有天赋,别人不会看你的教程:没有天赋,你不会如何发教程:没有天赋,周星驰就不会说这句话.名人说的话,是很有说服力和号召力的,很多广告就是这样做的.大家不相信吗?请看这一拉(左上向右下这一拉),拉多长?拉的角度如何?这操作对图效的影响如何?请自行试试.例如:我如图一拉,可以为背景层的MM添加一层蒙胧的光辉

JavaSwing也惊艳之二:环环相套

一.序言 关于"Java做不好桌面"的争论已经由来已久.虽然Swing和Java2D已经有超 过十年的历史,也有JIDE.JGoodies.TWaver等不少开源Swing组件,但是用 Java做桌面程序仍然不是一件轻松的事.本<Java也惊艳>系列文章,就是想通 过一些简单生动的例子,和大家一起认识Java.探索Swing.其实你只需要多一 点创意.多一点耐心,你的Java程序也可以"惊艳"!本文就带您一起进入Java 的惊艳之旅. 二.立体套管效果