Swift基础之闭包Closure学习
首先Swift语言中没有了Block内容,但是你可以通过调用OC文件使用,也可以使用Closure(闭包),实现Block或者Delegae同样反向传值或回调函数的效果,也可以解决函数指针的问题,两者有点类似,具体的使用方式,还需要大家进一步去研究,这里我只是简单实现一下闭包的效果,这个东西不太好理解,如果对Blocks比较熟的话,应该没问题
1.首先创建一个Swift项目,然后创建一个数组
let array1 = [22,33,99,88,44,11,55];
2.创建一个带有闭包结构的方法
写一个闭包方法,找到某一个范围内的数,当然这个方法也可以写在其他的类文件中,然后调用
//------这个地方Closure类似于OC中的Blocks
//func hasClosureMatch(方法名)(arr:[Int](参数一:数组), value:Int(参数二:数值), closureE:(num:Int)->Bool(参数三:闭包方法))-> Bool(返回类型)
func hasClosureMatch1(arr:[Int], value:Int, closureE:(num:Int)->Bool) -> Bool{
for item:Int in arr {
//这里只是调用closureE闭包里的方法,将结果返回,不管如何实现
//类似于OC中的Blocks,C当中的Function Pointer
if (closureE(num: item))
{
return true;
}
}
return false;
}
3.调用闭包方法,找是否有比40大的数字
let v1 = hasClosureMatch1(array1, value: 40) { (num) -> Bool in
return num >= 40;
}
print("v1 此时的结果 is \(v1)");
4.我们可以看到,上面的方法是没有调用value这个参数的,所以有点多余,把方法改一下,用上value值
修改后的方法
func hasClosureMatch2(arr:[Int], value:Int, closureE:(num:Int, value:Int)->Bool) -> Bool{
for item:Int in arr {
if (closureE(num: item,value: value))
{
return true;
}
}
return false;
}
然后使用脚本语言进行方法实现
//再写一个
let v4 = hasClosureMatch2(array1, value: 30) {
//这个地方,我们发现并没有写类型 (num, value) -> Bool in这句话,但是结果显示一样
//这也是Swift运用了脚本语言的特性,$0表示num,$1表示value
return $0 >= $1;
}
print("v4 此时的结果 is \(v4)");
//通过方法的调用,我们可以知道闭包就是在两个对象之间相互通讯
//-------------这里记录了,解决闭包循环引用的问题
/*
如何解决闭包的循环引用, 同样有三种方式:
1.使用weak修饰变量, 打破强引用, 因为使用weak修饰的变量有一次变成nil的机会
2.使用[weak self] 修饰闭包原理跟__weak类似, 这样在闭包中使用self, 就是弱引用
3.使用[unowned self ] 修饰闭包, 跟__unsafe_unretained类似, 不安全
当闭包和捕获的实例总是互相引用时并且总是同时销毁时,将闭包内的捕获定义为无主引用。
相反的,当捕获引用有时可能会是nil时,将闭包内的捕获定义为弱引用。弱引用总是可选类型,并且当引用的实例被销毁后,弱引用的值会自动置为nil。这使我们可以在闭包内检查它们是否存在。
*/
//解决方式三: [unowned self] 跟 _unsafe_unretained 类似 不推荐使用
loadData { [unowned self] (dataString) -> () in
print("\(dataString) \(self.view)")
}
}
func method2() {
//解决方式二: 在swift中 有特殊的写法 ,跟OC __weak 相似 [weak self]
loadData { [weak self] (dataString) -> () in
//以后在闭包中中 使用self 都是若引用的
print("\(dataString) \(self?.view)")
}
}
func method1() {
// 解决方式一: weak
weak var weakSelf = self
loadData { (dataString) -> () in
print("\(dataString) \(weakSelf?.view)")
}
}
结果显示:
源码Demo:http://download.csdn.net/detail/hbblzjy/9620090
这里推荐一篇文章(两者进行了图片讲解,容易理解):Swift与OC真正去理解Block解决循环引用的技巧
Swift基础之闭包Closure学习的更多相关文章
- Swift基础之闭包
内容纲要: 1.闭包基础 2.关于闭包循环引用 正文: 1.闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks) ...
- swift基础:第六部分:类与对象
http://reactnative.cn/docs/0.24/getting-started.html#content(react Native 开发文档) 互联网这个时代,你松懈一天,就会有很多很 ...
- swift基础:第二部分:函数和闭包
今天本来想利用上午的时间本来打算将swift基础部分学习完的,不巧的是,后台来和我讨论用户评价的接口,讨论过后,商讨出一种可行的方案,十几分钟时间过去了,我拿到将接口介入到已经完成的页面中,完美,终于 ...
- 第三篇、Swift基础学习
1.常量与变量 什么是常量和变量 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用let来定义常量,定义之后不可以修改 使用var来定义变量,定义之后可以修改 变量的 ...
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- Swift基础语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...
- Swift中的闭包(Closure) 浅析
转载自:http://www.devtalking.com/articles/closure-expressions-in-swift/ 闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储 ...
- iOS Swift 模块练习/swift基础学习
SWIFT项目练习 SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图 +控件 1.UIImag ...
- Swift基础学习
Swift基础学习 http://c.biancheng.net/cpp/html/2242.html 这个网站最近看了一下,对于基本语法解释概括的相对全面,如同重新练习一遍OC似的,挺全面的,谢谢 ...
随机推荐
- 在右键中添加以管理员运行CMD命令提示符 (进化版)
直接代码,转过来的 20180316更新添加快捷键A,点右键按A即可: Windows Registry Editor Version 5.00 ; Created by: Shawn Brink ; ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...
- Delphi 7中的四种消息框
Delphi中平常使用的消息框有四种形式,有ShowMessage.MessageDlg.Application.MessageBox.MessageBox.下面来深入了解下这四种形式的实现和使用.1 ...
- Delphi 7连接MySql 5.5.15(转)
网上有很多关于Delphi连接MySql数据库的文章,在这里,我只记录下自己测试过的方法,以备所需.系统环境:Windows XP SP3软件环境:Delphi 7 .mysql-installer- ...
- 谷歌开发者:看可口可乐公司是怎么玩转TensorFlow的?
在这篇客座文章中,可口可乐公司的 Patrick Brandt 将向我们介绍他们如何使用 AI 和 TensorFlow 实现无缝式购买凭证. 可口可乐的核心忠诚度计划于 2006 年以 MyCoke ...
- js遍历 for-of
for-of遍历 entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组.对于数组,键名就是索引值:对于 Set,键名与键值相同.Map 结构的 Iterator 接口,默认就是调 ...
- 开发网页时,127.0.0.1或者localhost能访问,而本机地址不能访问的解决
第一 ping试试 127.0.0.1 和 本机地址 若127.0.0.1可以 说明可以自己ping自己 若本机地址可以 说明host正常 第二 检查服务器部署 再部署一个新的 若新的正常 说明你项目 ...
- log4j不生成日志文件的问题
直接看我的注解吧 注意地址的斜杠,还有地址别写什么相对地址了,这包太老了,服务器update一下兼容问题就出来了. #第一个参数定义达到什么程度就输出 第二第三....第N 定义输出的类型 #debu ...
- 手写JAVA虚拟机(三)——搜索class文件并读出内容
查看手写JAVA虚拟机系列可以进我的博客园主页查看. 前面我们介绍了准备工作以及命令行的编写.既然我们的任务实现命令行中的java命令,同时我们知道java命令是将class文件(字节码)转换成机器码 ...
- ubuntu14.04拼音输入法问题的解决方法
14.04的自带的拼音输入法,打字的时候你会发现有很大的问题,打不出来一个完整的字. 解决方法: ibus-daemon -drx //重启ibus进程 在终端里输一次这个命令就ok了. 或者装个 ...