首先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学习的更多相关文章

  1. Swift基础之闭包

    内容纲要: 1.闭包基础 2.关于闭包循环引用 正文: 1.闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks) ...

  2. swift基础:第六部分:类与对象

    http://reactnative.cn/docs/0.24/getting-started.html#content(react Native 开发文档) 互联网这个时代,你松懈一天,就会有很多很 ...

  3. swift基础:第二部分:函数和闭包

    今天本来想利用上午的时间本来打算将swift基础部分学习完的,不巧的是,后台来和我讨论用户评价的接口,讨论过后,商讨出一种可行的方案,十几分钟时间过去了,我拿到将接口介入到已经完成的页面中,完美,终于 ...

  4. 第三篇、Swift基础学习

    1.常量与变量 什么是常量和变量 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用let来定义常量,定义之后不可以修改 使用var来定义变量,定义之后可以修改 变量的 ...

  5. Swift基础语法学习总结(转)

    Swift基础语法学习总结 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...

  6. Swift基础语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...

  7. Swift中的闭包(Closure) 浅析

    转载自:http://www.devtalking.com/articles/closure-expressions-in-swift/ 闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储 ...

  8. iOS Swift 模块练习/swift基础学习

    SWIFT项目练习     SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图  +控件 1.UIImag ...

  9. Swift基础学习

    Swift基础学习  http://c.biancheng.net/cpp/html/2242.html 这个网站最近看了一下,对于基本语法解释概括的相对全面,如同重新练习一遍OC似的,挺全面的,谢谢 ...

随机推荐

  1. [bzoj2648/2716]SJY摆棋子

    平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include< ...

  2. BZOJ4589 Hard Nim(快速沃尔什变换模板)

    终于抽出时间来学了学,比FFT不知道好写到哪里去. #include <cstdio> typedef long long ll; ,p=1e9+; int k,m,n,a[N],pi[N ...

  3. 抽象方法不能是static或native或synchroniz

    abstract 是抽象了,只有声明,没有具体的实现方法 static是静态的,是一种属于类而不属于对象的方法或者属性,而我们知道,类其实也是一个对象,他是在class文件加载到虚拟机以后就会产生的对 ...

  4. spring基本原理

    作者:王奕然链接:https://www.zhihu.com/question/21346206/answer/101789659来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  5. 解决警告: Setting property 'source' to 'org.eclipse.jst.jee.server_:' did not find a matching property.的方法

    今天第一次搭建struts2框架,跟着网上的教程导入对应的jar包之后就开始写登录的jsp页面,但是运行时出现了问题, 浏览器显示"The requested resource is not ...

  6. 判定程序员等级,HashMap就够了

    JDK1.8  HashMap源码分析 用到的符号: ^异运算:两个操作数相同,结果是;两个操作数不同,结果是1. &按位与:两个操作数都是1,结果才是1. 一.HashMap概述 在JDK1 ...

  7. ACM Primes

    Write a program to read in a list of integers and determine whether or not each number is prime. A n ...

  8. Docker 镜像

    Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. D ...

  9. fatal error C1083: Cannot open precompiled header file: 'Debug/xxoo.pch': No such file or directory

    fatal error C1083: Cannot open precompiled header file: 'Debug/xxoo.pch': No such file or directory ...

  10. Spring常用配置

    ----------------------------------------------------------------------------------------------[版权申明: ...