相比较 Objective-C 而言,Swift一些很有用的特性。Erica Sadun 在这篇总结了他最爱的 6 个。
Swift 有许多优点。下面介绍一下我最钟爱的 6 个函数。
1. Stride
Swift 的 stride 函数返回一个任意可变步长 类型值的序列。可变步长类型是可以设置偏移量的一维标量。所以,如果你要建立一个浮点序列,序列值的范围比如在 0.0 到 8π 之间,只需要使用 stride 去创建序列,然后通过一定的映射规则可应用到一个函数上。
1 2 3 4 5 |
let π = Double(M_PI) let max = 8.0 * π let damp = map( stride(from:0.0, to:max, by:π / 6.0)) {1 - cos($0) * exp(-(2.0 * $0 / max))} |
Stride 有两个变种。下面使用 to 形式创建了如下序列:
1 |
start, start + stride, start + 2 * stride…start + n * stride |
最后一个值严格小于最大值。但在 through 形式下,最后一个值将会小于或者等于最大值。
这和开区间与闭区间之间的区别大致相似。与闭区间不同,数学方法无法保证 through 方式生成序列的最后一个值能够等于最大值。通过如下表达式,
1 |
stride(from:0.0, through: 1.0, by: 0.3) |
生成的元素是 0.0, 0.3, 0.6, 0.9,下一个值将会是 1.2,但 1.2 大于 1.0,所以序列在 0.9 处终止了。
Stride 方法非常适合映射。当在 playground 中使用时,正如文章开头看到的那样,它可以创建漂亮的输出图表。
2.GeneratorOf
使用 GeneratorOf 方法,可以用一行或者两行代码快速创建序列。例如,下面代码输出一个自然数序列:
1 2 |
var n = 0 var naturalNumbers = GeneratorOf{n++} |
每次调用 next(),它都会输出一个新值。
1 2 3 |
naturalNumbers.next() // 0 naturalNumbers.next() // 1 naturalNumbers.next() // 2 |
稍微调整一下上述代码就,可以产生一个偶数序列:
1 2 |
var evenCount = 0 var evensGenerator = GeneratorOf{evenCount++ * 2} |
或者生成一个 Fibonacci 序列:
1 2 3 4 5 6 |
var fibs = ArraySlice([1, 1]) var fibGenerator = GeneratorOf{ _ -> Int? in fibs.append(fibs.reduce(0, combine:+)) return fibs.removeAtIndex(0) } |
Mike Ash 提供了一个单行代码生成 Fibonacci 序列的绝妙方法。(点击查看)
3. Split
使用 SplitS方法可以分解字符串或者其他序列,追加一个任意类型的分隔符,来决定具体在什么位置进行分割。
1 2 |
let lipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." let words = split(lipsum, isSeparator:{$0 == " "}) // ["Lorem", "ipsum", ...] |
4. Lazy
Lazy 方法返回一个可以用来筛选或者映射的序列或者集合类型,并且不会产生任何中间数组。使用这些结果作为另一个处理程序的输入。
1 |
let counts = lazy(words).map(count) |
5. Zip
Zip 方法利用序列创建值对。传入两个参数,Zip 可以返回一个 Zip2([T], [U]) 序列,可以用来映射或者过滤。
1 |
map(zip(words, counts)){println("($0): ($1)")} // Lorem : 5, ipsum : 5, ... |
通过映射的方法可以将条目压缩到数组对中。
1 |
let array = map(zip(a, b)){[$0, $1]} |
6. Format Strings
格式化字符串并不只用于 Foundation。可以建立你自己的字符串,不需要NSString。
1 |
String(format: "Value: %3.2ftResult: %3.2f", arguments: [2.7, 99.8]) |
使用以下的初始化语句,你可以省略两个方括号:
1 |
String.init(format: String, _ arguments: CVarArgType...) |
那么你所需要输入的是:
1 |
String(format:"Value: %3.2ftResult: %3.2f", 2.7, 99.8) |
如果喜欢这篇文章的话,可以查看我的 playgrounds book!
p.s. 谢谢Mike Ash 和 Kevin Ballard 提供的原材料。