• swift -- 闭包


    <1>闭包的声明(别名)

    typealias myBlock : (text : String!)  -> Void

    <2>声明闭包属性

    var block : myBlock!

    <3>实现闭包 (在其他类中)

    nextVC.block = {text in

      self.label!.text = text     //将值给label

    }

    <4>调用闭包(传值)

    self.block(text : self.textField!.text!)    //传textField中的文本

    ****swift 3.0********

    //1.简单的闭包

            // () -> () 没有参数,没有返回值的函数

            //都没有,in 可以一起省略

            let b1 = {

                print("hell")

            }

            //执行闭包

            b1();

            

            //2.带参数的闭包

            //闭包中的参数,返回值,实现 的代码都卸载{}

            //{(形参列表) -> (返回值类型)   ...实现代码}

            //需要使用关键字 in 用于分隔 定义 和实现

            let b2 = {(x: Int) -> () in

                

                print(x );

            }

            b2(121)

            

            //3.带参数 带返回值的闭包

            let b3 = {(x: Int) -> Int in

                return x + 33;

                

            }

            

            print( b3(100) );

     

     

    使用场景:

     

    一.异步回调

     

     override func viewDidLoad() {

            super.viewDidLoad()

            // Do any additional setup after loading the view, typically from a nib.

            

    //尾随闭包

    //如果函数的最后一个参数是闭包,函数可以提前结束,最后一个参数直接用{}包装闭包的代码

            loadDAta { (result) in

                print("获取的数据:(result)")

            }

        }

     

        

        /**

            异步执行任务,获取结果,通过block/闭包 回调

            闭包的应用场景和block一样

        */

        func  loadDAta(completion:@escaping (_ result: [String]) ->() )  {

            //GCD 将任务添加到队列中,指定执行任务的函数

            

            DispatchQueue.global().async {

                //耗时操作

                print("耗时操作:(Thread.current))")

                

                Thread.sleep(forTimeInterval: 1);

                //获得结果

                let json = ["头条","abc","哈哈"];

                //执行闭包,传递异步获取的结果

                completion(json);

                

                

                DispatchQueue.main.async {

                    print("主线程更新UI(Thread.current)")

                }

                

            }

            

            

        }

     

    二,界面间反向传值

     

    //1.第二个界面的属性

     

    //定义个闭包类型(别名)

    typealias Myclosure = (_ str: String) ->Void

     

    class OneViewController: UIViewController {

     

      //(1)定义闭包属性

        var myClosure:Myclosure?

        

        

        @IBAction func poppppppp(_ sender: Any) {

        

        //(2)执行闭包

            myClosure!("hello")

            

            self.dismiss(animated: true) { 

                

                

            }

            

        }

     

     //2. 第一个界面 给闭包 赋值

      @IBAction func click(_ sender: Any) {

            

            let oneVC = OneViewController();

            

        //(3)给闭包赋值,并获取回调内容

            oneVC.myClosure = {(str) ->Void in

                

                print("回到:(str)")

                

            }

            

            self.present(oneVC, animated: true, completion: nil)

            

            

        }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    快速搞懂.NET 5/.NET Core应用程序的发布部署
    .NET 5 程序高级调试-WinDbg
    mmap出现 Permission denied
    Java int和integer有什么区别 (mybatis踩坑)
    NodeJS mysql timestamp 数据插入失败的问题
    mysql case when 用法
    postcss 源码解析以及运用
    rust漫游
    关于接口设计的思考--我们真的需要这么多入参吗
    详解apollo的设计与使用
  • 原文地址:https://www.cnblogs.com/daxueshan/p/5586593.html
Copyright © 2020-2023  润新知