美文网首页
Swift闭包理解

Swift闭包理解

作者: iOS_July | 来源:发表于2019-03-14 14:08 被阅读0次
  • 基本
//闭包
    func closureDemo() -> () {
        
        //最简单的闭包
        let b1 = {
            print("hello world")
        }
        //执行
        b1()
        
        
        
        //带参数、无返回值的闭包
        /**
         * 闭包中,参数、返回值、实现代码,都是写在 {} 中
         * 需要使用一个关键字 in 分隔定义和实现的代码
         * { 行参列表 -> 返回值类型 in // 实现代码 }
         */
        let b2 = { (x : Int) -> () in
            print(x)
        }
        //执行
        b2(10)
        
        
        //带参数、带返回值的闭包
        let b3 = { (x : Int) -> Int in
            return x+10
        }
        print(b3(2))
        
    }
  • 实际理解
//MARK: - GCD 模拟
    func loadData(completion : @escaping (_ result : [String]) -> ()) -> () {
        
        //将任务添加到队列,指定执行任务的函数
        //队列调度任务(block/闭包),以 同步/异步 的方式执行
        
        DispatchQueue.global().async {
            print("耗时操作 \(Thread.current)")
            
            //休眠 模拟网络
            Thread.sleep(forTimeInterval: 1.0)
            let json = ["1","2","3"]
            
            
            //主队列 回掉
            DispatchQueue.main.async(execute: {
                print("主线程更新UI \(Thread.current)")
                
                // 回调 -> 执行 闭包(通过参数传递)
                //传递异步获取的结果
                completion(json)
            })
        }
    }
  • 调用
loadData { (result) in
            print("获取的数据 \(result)")
        }
  • 循环引用
//MARK: - 循环引用
    func loadData2(completion : @escaping () -> ()) -> () {
        
        DispatchQueue.global().async {
            print("耗时操作 \(Thread.current)")
            
            DispatchQueue.main.async(execute: {
                
                //回调、执行闭包
                completion()
                
            })
        }
    }
  • 解除循环引用
 //MARK: - 解除循环引用
        //1.OC 的方法
        //细节:使用的是 var,因为weak 可能在运行的时候被修改 -> 指向的对象一旦被释放,就会被自动设置为nil
        weak var weakSelf = self
        loadData2 {
            
            //细节2:解包方式有两种
            // ? 可选解包 - 如果self已经被释放了,不会向对象发送 getter 的消息,安全合理
            // ! 强行解包 - 如果self已经被释放了,强行解包会导致崩溃
            print(weakSelf?.view)
        }

//2.Swift 的推荐方法
        //[weak self] 表示 {} 中的所有 self 都是弱引用,需要注意解包
        loadData2 { [weak self] in
            print(self?.view)
        }
        
        //3.Swift 的另一个方法
        //[unowned self] 表示 {} 中的所有 self 都是assign的,不会被强引用,但是如果对象释放,指针地址不会变化
        //如果对象被释放,继续调用的话,就会出现野指针的问题
        loadData2 { [unowned self] in
            print(self.view)
        }
other

相关文章

  • Swift闭包理解

    基本 实际理解 调用 循环引用 解除循环引用

  • Swift-闭包

    Swift 闭包 函数 ()->() Swift 中的闭包和 Objective-C 中的 block 类似,闭包...

  • Swift闭包和函数

    函数在Swift中只是一种特殊的闭包,闭包在Swift语言中是一等公民,支持闭包嵌套和闭包传递。Swift中的闭包...

  • 14-Swift中的闭包

    闭包的介绍 闭包和OC中的Block非常相似(通俗点说:你也可以这么理解,Swift的闭包就是OC中的Block)...

  • 无标题文章

    个人理解swift中的闭包就是oc中的block [1]声明一个闭包: var closureName: (Par...

  • 在swift中如何声明闭包(closure)

    个人理解swift中的闭包就是oc中的block [1]声明一个闭包: var closureName: (Par...

  • swift4 闭包

    swift 闭包 闭包:swift 中 函数是闭包的一种类似于oc的闭包闭包表达式(匿名函数) -- 能够捕获上下...

  • Swift中的闭包

    在Swift中有两种闭包,逃逸闭包(@escaping)和非逃逸闭包(@nonescaping)。从Swift 3...

  • 100 Days of Swift - Day 06 - 闭包(

    100 Days of Swift - Day 06 - 闭包Closures 6.1 闭包 Swift函数也属于...

  • swift学习

    * 闭包 * 闭包作为属性 ```swift // 声明闭包类型 typealias callba...

网友评论

      本文标题:Swift闭包理解

      本文链接:https://www.haomeiwen.com/subject/kwbqmqtx.html