目录
前言
swift5.3中规定了多重尾随闭包必须填写参数名.经常使用rxswift,会发现里面默认的订阅就带着多重尾随闭包,而且里面的参数是没有默认值的,今天来做例子看下多重尾随闭包,在有默认值和没有默认值的调用结果.例子中为了能动态查看结果,使用了RxSwift对输入框UITextField进行了订阅.这样可以减少代码量,如果你不会也没事,我在代码里进行功能注释.
不带默认值的多重尾随闭包
swift5.3中,添加了尾随闭包的参数名,第一个参数名省略,后面的都要写上
//
// ViewController.swift
// MultipleTrailingClosures
//
// Created by tdw on 2021/3/18.
//
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
typealias Block = ()->()
@IBOutlet weak var tf: UITextField!
@IBOutlet weak var tf2: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
tf.rx.text.orEmpty.subscribe(onNext: { [unowned self] value in
request(result: value) {//把输入框输入的值穿给request方法,方法第2,3,4个参数是3个闭包,因为放在结尾,所以是多重尾随闭包,swift5.3中,添加了尾随闭包的参数名,第一个参数名省略,后面的都要写上
print("成功")
} onError: {
print("错误")
} onComplete: {
print("完成")
}
})
.disposed(by: disposeBag)
}
//当传入的字符串转换成整形> 10000的时候打印"成功",> 100显示"完成" ,否则显示"错误"
//request方法的第2,3,4参数,都是没有默认值的闭包,类型是 ()->()
func request(result:String,success:Block,onError:Block,onComplete:Block){
let result = Int(result) ?? 0
if result > 10000{
success()
}else if result > 100 {
onComplete()
}else{
onError()
}
}
看下运行结果
有默认参数的尾随闭包
下面代码多重尾随闭包,都给了默认参数空闭包 = {}
//带有默认值的方法,里面后3个被调用的时候是尾随闭包
func request2(result:String,success:Block = {},onError:Block = {},onComplete:Block = {}){
let result = Int(result) ?? 0
if result > 10000{
success()
}else if result > 100 {
onComplete()
}else{
onError()
}
}
调用端:多重尾随闭包,闭包参数都有默认参数的时候,调用的时候默认尾随闭包给了最后一个参数
tf2.rx.text.orEmpty.subscribe(onNext: { [unowned self] value in
request2(result: value){//多重尾随闭包,闭包参数都有默认参数的时候,调用的时候默认尾随闭包给了最后一个参数:onComplete
print("成功")
}
})
运行结果,只要最后一个参数onComplete:Block = {}被赋值了,其他闭包调用的时候都调用的默认值,空闭包
调用端 3个有默认参数的尾随闭给2个赋值,省略最后一个.
下面代码就是只赋值2个,最后一个省略了.就用默认值.
request2(result: value) {
print("成功")//只是最后一个参数3onComplete 省略了,调用默认的空闭包{}
} onError: {
print("错误")
}
总结:
有默认参数的,如果调用端只写一个尾随闭包,就是给最后一个闭包赋值,否则,就是顺序从前往后赋值