Swift闭包(block)详解

更新时间:2023-07-14 15:47:00 阅读: 评论:0

Swift闭包(block)详解
1、闭包
Swift对闭包进⾏了简化:
利⽤上下⽂推断参数和返回值类型
隐式返回单表达式闭包,即单表达式闭包可以省略return关键字
参数名称缩写
尾随(Trailing)闭包语法
先来看⼀个排序的例⼦,数组的降序排列数字俗语
let urnames = ["Wangwu", "Lisi", "Xiaoming", "Zhangsan"]
func backWards(s1: String, s2: String) -> Bool
{
return s1 > s2
}
let resultName1 = urnames.sorted(by: backWards)
手淫的技巧//resultName1: ["Zhangsan", "Xiaoming", "Wangwu", "Lisi"]
1.1 闭包表达式语法
{ (parameters) -> returnType in
statements
屈贾谊于长沙}
1.2 单表达式闭包隐式返回
单⾏表达式闭包可以通过省略return关键字来隐式返回单⾏表达式的结果
let resultName2 = urnames.sorted { s1, s2 in s1 > s2 }
密爱看片
1.3 参数名称缩写
let resultName3 = urnames.sorted { $0 > $1 }
1.4 函数式闭包河南安阳殷墟
let resultName4 = urnames.sorted(by: >)
2. 捕获值(Capturing Values)
闭包可以在其被定义的上下⽂中捕获常量或变量。即使定义这些常量和变量的原作⽤域已经不存在,闭包仍然可以在闭包函数体内引⽤和修改这些值。
3.闭包是引⽤类型(Closures Are Reference Types)
和类⼀样,必要也是引⽤类型
4. 尾随闭包(Trailing Closures))
尾随闭包是⼀个书写在函数括号之后的闭包表达式,函数⽀持将其作为最后⼀个参数调⽤:
let numReult2 = caculateTwoNumbers(num1: 3, num2: 4) {  $0 * $1 }
print(numReult2)
func caculateTwoNumbers(num1: Int, num2: Int, CaluFunction: (Int, Int) -> Int) -> Int{
return CaluFunction(num1, num2)
}
5. 逃逸闭包(@escaping)
func mainFunc(){
//调⽤函数
doSomething(paramClosure: {print("hello")})
doSomething(paramClosure:{print("word!")})
//逃逸调⽤闭包
for closurePrama in functionArray {
closurePrama()
}
//⾮逃逸闭包
someFunctionWithNonescapingClosure { (a) in
print(a)
}
}
大白免//声明⼀个存放函数的数组
var functionArray: [() -> Void] = []
//定义⼀个接收闭包参数的函数,如果定义⾮逃逸函数 func doSomething(@noescape paramClosure:() -> Void) 就会编译错误
func doSomething(paramClosure:@escaping  () -> Void){
//把参数放⼊数组中,⽤于逃逸调⽤
functionArray.append(paramClosure)
}
//⾮逃逸闭包默认@noescape 可以省略不写
func someFunctionWithNonescapingClosure(closure: (_ num:Int) -> Void) {
let a = 1
closure(a)
}
6、noescape是⾮逃逸的意思。
@noescape关键字代码中扮演了⼀个标注的作⽤:来说明⼀个闭包参数,该闭包参数与此API是同步的,它只在此API中被调⽤。只要该API运⾏结束,该闭包的⽣命周期就结束。也就是说,该闭包逃不出该API的⼿掌⼼。哈哈哈哈!它对编译器和API调⽤者来说:编译器会对代码做⼀些优化,⽽API调丑陋的拼音
⽤者则可以放⼼⼤胆的使⽤该API,不⽤因为担⼼造成引⽤循环⽽去使⽤捕获列表。同时在其中调⽤实例变量或实例⽅法的时候可以不使⽤"lf."
但是!如何使⽤这个@noescape标注,这是需要正确的姿势的!
上⾯的论述,只有在闭包是临时创建,即没有被API外部的任何其他属性或全局变量持有的前提下才成⽴!!
怀孕有什么特征
func withLock(@noescape perform closure: () -> Void) {
myLock.lock()
closure()
myLock.unlock()
}
In  Objective-C
- (void)performWithLock:(__attribute__((noescape)) void (^)())block {  // expod as @noescape to S
wift
[myLock lock];
block();
[myLock unlock];
}
⾯试题:调⽤Masonry的block为何不⽤weak?
原因就是使⽤了栈block,都是⽤NS_NOESCAPE修饰block.编译器会相应地做⼀些优化,例如去掉⼀些多余的对lf的捕获、retain、relea操作。
- (NSArray *)mas_makeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;
- (NSArray *)mas_updateConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;
- (NSArray *)mas_remakeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;

本文发布于:2023-07-14 15:47:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1081331.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:参数   函数   表达式   变量
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图