import UIKit
var words = ["abd","angry","anger","hungry"]
words.filter{ (a: String) -> Bool in return a == "abd" } //按闭包的规则筛选
.map{ (a: String)-> String in return a+"C" } //按闭包的规则转换,map并不修改原数值的内容,只是返回处理后的新数组
.reduce("OXOX", combine: { (a:String, b:String) -> String in return a+b }) //按闭包规则组合三个字符串
//上面三个方法其实是在一行,不断的向后处理,更便于查看,与下面相同效果
words.filter({ (a: String) -> Bool in return a == "abd" }).map({ (a: String) -> String in return a+"C" } ).reduce("OXOX",combine: { (a:String, b:String) -> String in return a+b })
//用隐式参数简化
println(
words.filter{ $0 == "abd"}
.map{ $0+"C" } //把传过来的每个元素统一进行一个操作:(如果是送过来一对元素,则有$0,$1)与C相加
.reduce("OXOX"){"\($0)\($1)"}
)
//====捕获====
//闭包(函数也是闭包)中,可以捕获闭包外的变量的地址,并使用之
func sum(numbers: [Int]) -> [Int] {
var sum1 = 0
var sum2 = 0
var sum3 = 0
var someNumber : [Int]
numbers.map{
sum1 += $0
}
someNumber = numbers.map {
(item: Int) -> Int
in sum3 += item
return sum3
}
for item in numbers {
sum2 += item
}
println("sum1=\(sum1),sum2=\(sum2),sum3=\(sum3)")
return someNumber
}
var intarr2: [Int]=[1,2,3,5]
var numberArr = sum(intarr2)
var newarr = numberArr.map{ $0+1 }
newarr //[2, 4, 7, 12]
//函数式编程
//将函数、方法作为参数送给系统方法,不需要使用闭包了
words.map(println) // 等价于 words.map({ println($0) })
func addString(var someString: String) -> String{
return someString + "!"
}
var newwords = words.map(addString) //["abd!","angry!","anger!","hungry!"]
//闭包/函数都是ARC对象
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount //该嵌套函数从外部捕获了runningTotal和amount,runningTotal是引用,amount是复制值。只要这个函数一直有被调用,runningTotal会因此而继续存活(在非捕获的情况下,函数执行完,即return incrementor后,runningTotal就会销毁,而存在捕获的情况下,则不会)
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement:10)
incrementByTen() //返回10
incrementByTen() //返回20