Swift-函数式编程、捕获、闭包内存管理

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  //该嵌套函数从外部捕获了runningTotalamount,runningTotal是引用,amount是复制值。只要这个函数一直有被调用,runningTotal会因此而继续存活(在非捕获的情况下,函数执行完,即return incrementor后,runningTotal就会销毁,而存在捕获的情况下,则不会)

       return runningTotal

    }

    return incrementor

}

let incrementByTen = makeIncrementor(forIncrement:10)

incrementByTen()    //返回10

incrementByTen()    //返回20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值