美文网首页Swift一步步学习
Swif学习之闭包的使用

Swif学习之闭包的使用

作者: coderhlt | 来源:发表于2018-05-18 18:07 被阅读6次

    一、闭包的定义

    闭包和OC中的block非常相似,OC中的block是匿名的函数
    Swift中的闭包是一个特殊的函数。在swift中也算是一种特殊的数据类型,即闭包类型。

    • 1、闭包的定义
      //无参数、无返回值的闭包
           let callback :() -> (Void) = {    () -> (Void)  in
                                          print("这是一个完整的没有参数,没有返回值的闭.   包")
                                      }
    
               callback ()
    
      //有参数、无返回值的闭包
     let callback: (String) -> (Void)  = {  (str:String) -> (Void) in
                                          print("这是一个完整的有参数,没有返回值的闭包")              
                                     }
               callback ("11111")
      //有参数、有返回值的闭包
      let callback: (String) -> (String) = { (str:String) -> (String) in
               
                                        print("这是一个完整的有参数,有返回值的闭包")
                                        return "1111";
              
                                         }
       let str = callback("ssss")
       print(str)
      ---------------------------------------------------------------------总结:
    闭包的写法:
        闭包类型的写法:(形参列表)->(返回值)
        闭包值的写法:
        {
            (形参) -> 返回值类型 in
            // 执行代码
        }
      ---------------------------------------------------------------------
    #pragma mark - 无参数无返回值闭包其他省略写法
     let callback1  = { () in
                      print("没有参数,没有返回值的闭包")
                      }
             callback1 ()
    
     let callback2  = {
                print("没有参数,没有返回值的闭包")
            }
             callback2 ()
    
    
    • 2、尾随闭包
    //2.1.闭包作为参数传递
            func test(callback:() -> ()){
                callback()
            }
            test(callback: {() -> () in
                 print(122)
            })
            
            func test1(testback:(Int) -> () ){
                testback(22222)
            }
        
            test1(testback:{(a:Int) -> () in
                print(a);
            })
    //2.2.尾随闭包
    a、如果闭包是函数的最后一个参数,则可以将闭包写在()后面,这种写法就是尾随闭包。  
    
    //函数一个参数
         test1(testback:) {  (a:Int) -> () in
                print(a);
           }
            
    
    //函数多个参数
        func test1(c:Int ,testback:(Int) -> () ){
                testback(3333)
            }
          test1(c:12){(a:Int) -> () in
                print(a);
            }
            
    b、如果函数只有一个参数,并且这个参数是闭包,那么()可以不写
            func test1(testback:() -> () ){
                testback()
            }
            
            test1{() -> () in
                print(12345678);
            }
         
    c、 网络请求工具类
    import UIKit
    class HttpTool: NSObject {
        func requestData(finishedCallback:(String) -> ()) {
            finishedCallback("response");
        }
    }
      
    
     import UIKit
     class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    //        httptool.requestData(finishedCallback:{ (str:String) in
    //            print(str)
    //        })
    //    }
    
    //        httptool.requestData() { (str:String) in
    //           print(str)
    //        }
    
          let httptool = HttpTool()
            httptool.requestData { (str:String) in
               print(str)
            }
    
        }
    
    }
    
      
    
    • 3、逃逸(escaping)
      一个接受闭包作为参数的函数,逃逸闭包(可能)会在函数返回之后才被调用,也就是说闭包逃离了函数的作用域
    import UIKit
    
    class HttpTool: NSObject {//@escaping逃逸的
        func requestData(finishedCallback:@escaping (String) -> ()) {
            DispatchQueue.global().async {
                 finishedCallback("response");
            }
    
        }
    
    }
    
    

    相关文章

      网友评论

        本文标题:Swif学习之闭包的使用

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