Swift闭包的使用



//闭包

//1.定义:接近变量和常量(函数是一种特殊形式的闭包)

//闭包表达式:封闭的能捕获它周围的常量、变量值的,lightweight一个非常简洁,言简意赅的表达式,它的特点有cleanclear

//优化:1.它可以根据周围的内容来对它自身的闭包表达式的参数或者类型进行推断

//     2.它不是直接的返回一个表达式的值

//     3.它的参数非常容易速记

//     4.挂尾

 

//2.sorted函数:是对一个数组进行排序,sorted函数第一个函数要求是数组,第二个函数要求是闭包表达式

let 城市列表 = ["Beijing","NewYork","Paris","Shenzhen","Shanghai"]

func 字母靠后(字符串1:String , 字符串2:String) -> Bool{

    return 字符串1 > 字符串2

}

var 新城市列表 = sorted(城市列表,字母靠后)

println("城市列表为:\(城市列表),新城市列表为:\(新城市列表)")

//城市列表为:[Beijing, New York, Paris, Shenzhen, Shanghai],新城市列表为:[Shenzhen, Shanghai, Paris, New York,Beijing]

 

//3.闭包表达式({(字符串1:String , 字符串2:String) -> Bool in return 字符串1 > 字符串2}--->闭包)

var 新城市列表2 = sorted(城市列表, {(字符串1:String , 字符串2:String) -> Bool inreturn 字符串1 > 字符串2

    })

println("城市列表为:\(城市列表),新城市列表为:\(新城市列表2)")

//城市列表为:[Beijing, New York, Paris, Shenzhen, Shanghai],新城市列表为:[Shenzhen, Shanghai, Paris, New York,Beijing]

 

//4.闭包参数类型推断(把字符串的类型省略了)

var 新城市列表3 = sorted(城市列表, {(字符串1, 字符串2) ->Bool in return字符串1 > 字符串2

    })

println("城市列表为:\(城市列表),新城市列表为:\(新城市列表3)")

//城市列表为:[Beijing, New York, Paris, Shenzhen, Shanghai],新城市列表为:[Shenzhen, Shanghai, Paris, New York,Beijing]

 

//5.闭包单行间接返回(当只有一行表达式的时候可以省略return

var 新城市列表4 = sorted(城市列表, {(字符串1, 字符串2) ->Bool in 字符串1 > 字符串2

    })

println("城市列表为:\(城市列表),新城市列表为:\(新城市列表4)")

//城市列表为:[Beijing, New York, Paris, Shenzhen, Shanghai],新城市列表为:[Shenzhen, Shanghai, Paris, New York,Beijing]

 

//6.闭包参数简写

var 新城市列表5 = sorted(城市列表, {$0> $1})

println("城市列表为:\(城市列表),新城市列表为:\(新城市列表5)")

//城市列表为:[Beijing, New York, Paris, Shenzhen, Shanghai],新城市列表为:[Shenzhen, Shanghai, Paris, New York,Beijing]

 

//7.操作符函数(>等操作符本来就是一个函数,连参数和函数体({})都可以省略了)

var 新城市列表6 = sorted(城市列表, >)

println("城市列表为:\(城市列表),新城市列表为:\(新城市列表6)")

//城市列表为:[Beijing, New York, Paris, Shenzhen, Shanghai],新城市列表为:[Shenzhen, Shanghai, Paris, New York,Beijing]

闭包就讲到这里了哈,如果有不全的请多多见谅哈!

Swift 中,闭包是一种自包含的函数代码块,可以在代码中被传递和使用闭包有能力捕获和存储其所在上下文中任意常量和变量的引用。当闭包中引用了外部的对象时,为了避免循环引用(strong reference cycle),我们需要使用弱引用(weak reference)。 在闭包使用弱引用可以防止闭包持有外部对象的强引用,从而避免循环引用的问题。循环引用指的是两个或多个对象之间相互持有对方的强引用,导致它们无法被释放,造成内存泄漏。 在 Swift 中,我们可以使用 `[weak self]` 或者 `[unowned self]` 语法来声明一个对外部对象的弱引用。`[weak self]` 会将对外部对象的引用标记为弱引用,而 `[unowned self]` 则标记为无主引用。 下面是一个使用弱引用的闭包示例: ```swift class SomeClass { var completionHandler: (() -> Void)? func doSomething() { completionHandler = { [weak self] in // 使用 weak self 避免循环引用 guard let self = self else { return } // 在闭包使用 self print("Doing something in \(self)") } completionHandler?() } } let instance = SomeClass() instance.doSomething() ``` 在上面的示例中,我们使用了 `[weak self]` 来声明对外部对象的弱引用。在闭包中,我们使用了 `guard let self = self else { return }` 来确保在闭包执行时,外部对象仍然存在。这样可以避免在闭包使用已经被释放的对象。 需要注意的是,使用弱引用可能会导致外部对象在闭包执行期间被释放,因此在闭包使用弱引用的对象时,需要进行额外的判断以确保其存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值