原文地址:Functional Snippet #4: Flattening and Mapping Arrays
原文日期:2014-10-27

原文代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
infix operator >>= {}
func >>=<A, B>(xs: [A], f: A -> [B]) -> [B] {
return xs.map(f).reduce([], combine: +)
}
let ranks = ["A", "K", "Q", "J", "10",
"9", "8", "7", "6", "5",
"4", "3", "2"]
let suits = ["♠", "♥", "♦", "♣"]
let allCards = ranks >>= { rank in
suits >>= { suit in [(rank, suit)] }
}
// Prints: [(A, ♠), (A, ♥), (A, ♦),
// (A, ♣), (K, ♠), ...

代码段说明

Read More

原文连接:a practical introduction to functional programming
原文日期:2015/08/10

介绍

Swift 为 iOS 编程世界引入了一个新的范式:函数式范式。大多数 iOS 开发者之前都习惯了用 Objective-C 或者其他面向对象编程语言,函数式的编码和思考会变得有点烧脑(brain-addling)。
应该从那里开始学习呢?我找到了一些非常容易理解的例子 - 在Mary Rose Cook的 blog 中找到了一篇非常好的文章:A practical introduction to functional programming,这篇文章很好,足够解答我的疑惑,而且这篇文章包含了很多示例代码,我们可以在此基础上加上函数式的补充。

Read More

原文链接:The Official raywenderlich.com Swift Style Guide
原文日期:2015/07/01

这篇Swift风格指南与你看到的其他的指南有所不同,此篇指南主要焦点集中在打印和web展示的可读写上。我们创建此篇风格指南的目的,是为了让我们的图书,教程以及初学者套件中的代码保持优美和一致,即使我们有很多不同的作者共同编写这些图书。

我们的首要目标是一致性,可读性和简洁性。

还在使用Objective-C?也可以参考我们的Objective-C风格指南

Read More

原文链接:Efficient JSON in Swift with Functional Concepts and Generics
原文日期:2014/08/06

就在几个月前,苹果推出了一门全新的编程语言,其名为Swift, 这让我们对未来 iOS 和 OS X 开发充满了期待与兴奋。人们纷纷开始使用 Xcode Beta1 版本来进行 Swift 开发,但是很快就发现解析 JSON 这一常见的操作在 Swift 中并不如在 Objectitve-C 中那样快捷和方便。Swift 是一门静态类型的语言,这意味我们不能简单地将对象赋值给一个特定类型的变量,并且让编译器相信这些对象就是我们所声明的那种类型。在 Swift 当中,编译器会进行检查,以确保我们不会意外地触发运行时错误。这使得我们可以依赖编译器来写出一些无 bug 的代码,同时我们必须做许多额外的工作来使编译器不报错。在这篇文章当中,我将使用函数式思想和泛型来探讨如何编写易读高效的 JSON 解析代码。

Read More

原文地址:Functional Snippet #2: Function Composition

原文代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func getContents(url: String) -> String {
return NSString(contentsOfURL: NSURL(string: url),
encoding: NSUTF8StringEncoding, error: nil)
}
func lines(input: String) -> [String] {
return input.componentsSeparatedByCharactersInSet(
NSCharacterSet.newlineCharacterSet())
}
let linesInURL = { url in countElements(lines(getContents(url))) }
linesInURL("http://www.objc.io")
//运算符重载,通过实现函数组合
infix operator >>> { associativity left }
func >>> <A, B, C>(f: B -> C, g: A -> B) -> A -> C {
return { x in f(g(x)) }
}
let linesInURL2 = countElements >>> lines >>> getContents
linesInURL2("http://www.objc.io/books")

代码段说明

Read More

原文地址:Functional Snippet #1: Decomposing Arrays

原文代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extension Array {
var decompose : (head: T, tail: [T])? {
return (count > 0) ? (self[0], Array(self[1..<count])) : nil
}
}
func sum(xs: [Int]) -> Int {
if let (head, tail) = xs.decompose {
return head + sum(tail)
} else {
return 0
}
}
var xs: [Int] = [1, 2, 3]
let result = sum(xs)
result //result=6

代码段说明

Read More

1、闭包是什么?

官方文档中,闭包的定义比较难以理解。只是说跟Objective-C中的block和其他语言当中的lambda类似。我的理解,在Swift中,首先,闭包是一个代码块,可以匿名,也可以有名字;其次,闭包需要在一个确定的代码上下文中使用,能够捕获上下文的变量,使用这些变量来处理一些额外的逻辑;第三,闭包有很多形式,可以根据上下文来写出非常简要的闭包形式,使得代码更加优雅。

Read More