Objective-C中的block与Swift中的尾随闭包使用教程

 更新时间:2020年6月30日 23:37  点击:1623

前言

在项目开发中经常会去查iOS闭包怎么写,因为它的语法太古怪,两种语言写法不一,经常搞混,干脆记录下常用的写法算了

闭包定义

闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。

OC中的block与Swift中的尾随闭包都起到了将参数作为返回值的作用,也就是常说的回调。

1. block的使用

在OC中block主要分为三种,分别是

    (1)_NSConcreteGlobalBlock 全局静态,

    (2)_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁,

    (3)_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁。

而我们在使用block时大致分为以下几步:

//1.使用typedef定义一个block
typedef void(^CallBack1)(); //不带参数 
typedef void(^CallBack2)(NSString *test); //带参数
//2.通过属性声明
@property (nonatomic, copy) CallBack callBack;
//3.通过函数方法声明
- (void)functionCallBack:(CallBack)callBack;

其实呢,如果写的比较熟练了,也可以连着一起定义:

@property (nonatomic, strong) void(^ completed1)();//不带参数
@property (nonatomic, strong) void(^ completed2)(NSString *test);//带参数
- (void) functionCallBack:(void(^)())completed1;//不带参数
- (void) functionCallBack:(void(^)(NSString *test))completed2;//带参数

2. 尾随闭包的使用

在Swift中,闭包是一段自包含的函数代码块,可以在代码中使用和传递,相当于一个匿名函数。

那么尾随闭包就是这个函数的最后一个参数是一个闭包,所以规定这个闭包既可以写在函数的参数括号里面,也可以直接放在最后面来使用,就像重新给这个函数定义了一次一样。

并且,它的写法和block很相似:

//1.使用typealias定义
typealias functionBlock1 = () -> ()//不带参数
typealias functionBlock2 = (String) -> ()//带参数
//2.声明函数体
func blockTest1(complete: (functionBlock1)) -> () {
  complete()
}
func blockTest2(complete: (functionBlock2)) -> () {
  let re: String = "Cookie"
  complete(re)
}
//3.使用函数
blockTest1 {}
blockTest2{ (result) in
   print(result)
}

同样的,如果写的比较熟练了,也可以连着一起定义:

//1.声明函数体
func blockTest(complete: (_ result: String)->()) -> () {
  
  let re: String = "Cookie"
  complete(re)
}
//2.使用函数
blockTest { (result) in
   
   print(result)
}

除此之外,swift中的闭包还包括逃逸闭包,这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸,多用来做函数回调,与Objective-C里的Block有异曲同工之妙。自动闭包,作为参数传递给函数时,可以将闭包定义为自动闭包(使用关键字@autoclosure),这样传递参数时,可以直接传递一段代码(或者一个变量、表达式),系统会自动将这段代码转化成闭包。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对猪先飞的支持。

[!--infotagslink--]

相关文章

  • Objective-C的内省(Introspection)用法小结

    这篇文章主要介绍了Objective-C的内省(Introspection)用法,这是面向对象语言和环境的一个强大特性,需要的朋友可以参考下...2020-04-25
  • iOS block循环引用详解及常见误区

    这篇文章主要介绍了iOS block循环引用详解和应用,常见误区详解,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-08-22
  • Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析

    这篇文章主要介绍了Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析,有助于更加直观的理解Object-C常用的结构体,需要的朋友可以参考下...2020-04-25
  • Objective-C和Swift的转换速查手册(推荐)

    这篇文章主要给大家介绍了关于Objective-C和Swift的转换速查手册的相关资料,文中通过示例代码介绍的非常详细,非常推荐给大家参考学习使用,需要的朋友们下面随着小编来一起学习学习不...2020-06-30
  • Objective-C限制函数调用的频率详解

    这篇文章主要给大家介绍了关于Objective-C限制函数调用的频率的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-04-25
  • Objective-C 消息传递机制详解

    Objective-C语言中方法的传递有二种:①Selector ② Blocks,本文主要说一下Selector,本文以Objective-C 消息传递机制进行详细介绍,关于Blocks会在后续总结一下...2020-04-25
  • Objective-C中字符串的拼接方法小结

    这篇文章主要介绍了Objective-C中字符串的拼接方法小结,除了依靠NSString,文中还介绍了在宏里拼接字符串的方法,需要的朋友可以参考下...2020-06-30
  • Objective-C中的block与Swift中的尾随闭包使用教程

    Block是OC中的闭包,他和swift中的闭包有什么区别呢?下面这篇文章就来给大家介绍关于Objective-C中的block与Swift中的尾随闭包使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。...2020-06-30
  • 在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    这篇文章主要介绍了在一个项目中同时使用Swift和Objective-C代码的方法,在一个工程中同时使用Swift和Objective-C混合语言编程的方法,需要的朋友可以参考下...2020-06-30
  • iOS block的值捕获与指针捕获详解

    Block它是C语言级别和运行时方面的一个特征,下面这篇文章主要给大家介绍了关于iOS block的值捕获与指针捕获的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下...2022-02-08
  • Objective-C 入门篇(推荐)

    由C语言和Smalltalk扩展出来的,是C语言的超集,最大的区别是OC是面向对象的,其火星文写法对于之前从事Java开发的同学颇感蛋疼,OC最大特点之一是使用消息结构而不是函数调用...2021-11-28