Swift基础篇——闭包

闭包

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        /* OC: block类似于匿名函数,用于封装代码块,在特定的时候执行,执行一些耗时操作 类型: 返回值类型(^block名称)(形参列表) 值: ^(形参列表){ 需要执行的代码 } Swift: 闭包是用于定义函数(Swift中函数就是闭包,闭包就是一个特殊的函数) 执行一些耗时操作 类型: (形参列表)->返回值类型 值: { (形参列表)->返回值类型 in 需要执行的代码 } */
    }


    override func touchesBegan(touches: Set<UITouch>,withEvent event: UIEvent?) {
        /* 闭包的几种格式 1. 完整写法 loadData ({ () -> () in print("更新UI") }) 2.如果闭包没有形参,那么in和in之前的代码都可以省略 loadData ({ print("更新UI") }) 3.如果闭包是函数的最后一个参数,那么闭包可以写在函数()的后面 loadData (){ print("更新UI") } 4.如果函数只有一个闭包参数,那么函数的()可以省略 loadData { print("更新UI") } */
        // in是用于区分代码和描述
        // loadData {
        // print("更新UI")
        // }

        loadMoreData { (str) -> () in
            print("刷新了UI界面----\(str)")
        }

    }

    //MARK: - 加载数据loadData方法
    func loadData(finished: ()->())
    {
        dispatch_async(dispatch_get_global_queue(0,0)) { () -> Void in
            print(NSThread.currentThread())
            print("加载数据")

            dispatch_async(dispatch_get_main_queue(),{ () -> Void in
                print(.currentThread())
                finished()
            })
        }
    }

    //MARK: - 加载更多数据loadMoreData方法
    func loadMoreData(finished: (str: String)->())
    {
        dispatch_sync(dispatch_get_global_queue("加载更多数据")

            in
                // 回到主线程刷新UI
                print("回到主线程刷新UI")
                finished(str: "走起")
            })
        }
    }
}

闭包的引用循环问题

import UIKit

class ViewController: UIViewController {

    // 注意: 在设置闭包属性是可选类型时一定更要用一个()括住闭包的所有的类型,否则只是指定了闭包的返回值是可选的
    // 错误写法: var callback: ()->()?
    var callback: (()->())?

    override func touchesBegan(touches: Set<UITouch>,withEvent event: UIEvent?) {

        // OC中如何解决: __weak typeof(self) weakSelf = self;
        // Swift中如何解决: weak var weakSelf = self
        // 对应关系: __weak == weak __unsafe_unretained == uNowned

        // 在Swift开发中,能不写self就不写slef
        // 一般情况下只有需要区分参数,或者在闭包中使用

// MARK: - 处理循环引用的方法
        /* weak var weakSelf = self loadData { () -> () in print("被回调了") weakSelf!.view.backgroundColor = UIColor.redColor() } */

// MARK: - 处理循环引用的方法
        loadData { [uNowned self] ()-> () "被回调了")
            self.view.backgroundColor = UIColor.redColor()
        }

    }

    func loadData(finished: ()->())
    {
        callback = finished
        // 1.加载数据
        print("加载数据")

        // 2.执行回调
        finished()
    }

// MARK: - deinit 相当于OC中的dealloc方法
    // 只要一个对象释放就会调用deinit方法
    deinit
    {
        print("88")
    }
}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...