swift5.3多重尾随闭包有默认参数和无默认参数调用顺序教程和demo代码下载

54 篇文章 1 订阅
6 篇文章 0 订阅

前言

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("错误")
            }

在这里插入图片描述

总结:

有默认参数的,如果调用端只写一个尾随闭包,就是给最后一个闭包赋值,否则,就是顺序从前往后赋值

demo下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值