Swift 闭包的使用(尾随闭包)

-闭包的使用

    提问:block 的应用场景是什么?

    1. `网络(异步的)代码添加到队列,队列调度完成` -> 回调

    无法通过返回值通知调用方

    2. 回调的数值,是通过 block 的 `参数进行传递的`


     1. Swift 中一般不需要使用 self.,但是 闭包中必须要使用

         为什么?

         - 正常的代码,当前 `上下文` 隶属于同一个对象,直接访问属性,是没有问题的

         - 闭包是提前准备好的代码,在执行的时候,需要告诉函数访问哪一个对象的属性

         - 因此,在闭包中必须要使用 self.

         2. 建议:平时不要写 self.,如果 Xcode 提示,会注意到闭包

        

            3. 解包

            ! - 强行解包

            ? - 可选解包

                * 如果有值,返回 `可选值`

                * 如果没有值,给 nil 发送后续的消息 `setFrame` -> 什么都不做!

 UIView.animateWithDuration(0.5, animations: { () -> Void in
            self.demoView?.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
            }) { _ in
                print("hehe")
        }
    }

    

// `尾`随闭包
    // 1. 闭包是最后一个参数
    // 2. 函数的 `) ` 可以前置到倒数第二个参数末尾
    // 3. 后面的参数直接使用 { // 执行代码 }
    // 4. 尾随闭包,不需要外部参数,用处,通常一个函数的末尾,如果添加了一个闭包参数,使用 尾随闭包就方便了!
    // 闭包的补充:如果没有参数/没有返回值, `in` 前面的所有内容都可以省略
    func tailDemo() {
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("hehe")
        }
        dispatch_async(dispatch_get_global_queue(0, 0), { () -> () in
            print("xixi")
        })
    }

    

// 1. 参数 (text: String) -> (),接收 字符串,没有返回值的闭包
    // 提前准备好的代码,需要的时候调用
    func loadData(callback: (text: String)->()) {
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            let str = "html"
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                // 通过回调通知调用方,把异步请求结束的结果,通过参数,传递给闭包
                callback(text: str)
            })
        }

<pre name="code" class="objc">class ViewController: UIViewController {
    var demoView: UIView?
    override func viewDidLoad() {
        super.viewDidLoad()

        // 尾随闭包
//        loadData { (text) -> () in
//            print(text)
//        }
       
        // 函数方式调用
//        loadData({ text -> () in
//            print(text)
//        })
        
        loadData { text in
            print(text)
        }


 
  

       

 // 动画演示
        let v = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
        v.backgroundColor = UIColor.redColor()
        view.addSubview(v)
        demoView = v
//        tailDemo()
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {        
//        UIView.animateWithDuration(0.5) { () -> Void in
//            self.demoView?.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
//        }
//        UIView.animateWithDuration(0.5, animations: { () -> Void in
//            self.demoView?.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
//            }) { (_) -> Void in
//                print("hehe")
//        }
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值