Swif学习之闭包的使用

一、闭包的定义

闭包和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学习之闭包的使用)