闭包
1.闭包表达式语法
{ (parameters) -> return type in
statements
}
2.闭包和类的强引用
当将一个闭包赋值给一个类实例的属性,并且闭包体捕获这个实例时,也可能存在一个强引用循环。捕获实例是因为闭包体访问了实例的属性,就像self.someProperty,或者调用了实例的方法,就像self.someMethod()。不管哪种情况,这都造成闭包捕获self,造成强引用循环。
闭包之sort函数
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
// Sort函数
func backwards(s1: String, s2: String) -> Bool { return s1 > s2 }
var reversed = sorted(names, backwards)
// 闭包:-表达式语法
reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
// 闭包:-根据上下文推断类型
reversed = sorted(names, { s1, s2 in return s1 > s2 } )
// 闭包:-单行表达式闭包可以省略 return
reversed = sorted(names, { s1, s2 in s1 > s2 } )
// 闭包:参数名简写
reversed = sorted(names, { $0 > $1 } )
// 闭包:-运算符函数
reversed = sorted(names, >)
//闭包: Trailing 闭包
reversed = sorted(names) { $0 > $1 }
闭包 之 map函数
1. Swift 的 Array 类型有一个 map 方法,其获取一个闭包表达式作为其唯一参数。数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值(也可以是不同类型的值)。
2. 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
}
// 字典 digitNames 下标后跟着一个叹号 (!),因为字典下标返回一个可选值 (optional value),表明即使该 key不存在也不会查找失败。 在上例中,它保证了 number % 10 可以总是作为一个 digitNames 字典的有效下标 key。 因此叹号可以用于强展开 (force-unwrap) 存储在可选下标项中的 String 类型值。
网友评论