閉包是自包含的函數代碼塊,可以在代碼中被傳遞和使用.(參考OC中的Block)
一. 定義閉包或者block
1.先聲明,在進行定義屬性
Swift中使用typealias(起別名)可以來對閉包起別名例如:
//閉包定義: 閉包名字 = (參數)->(返回值)
typealias TYBlock = ()->()//無參無返回值
//定義屬性
var tyBlock: TYBlock?
//定義表達式
self.tyBlock = {
print("哈哈哈")
}
//調用
if tyBlock != nil {
tyBlock!()
}
OC中同樣:
//Block指針定義:返回值 (^Block名字)(參數列); 如:int (^cube)(int a)
typedef void(^ TYBlock)();//參數是字符串類型,無返回值
//定義屬性
@property (nonatomic, strong) TYBlock testBlock;
//Block變量的賦值格式為: Block變量 = ^(參數列表){函數體};
testBlock = ^{
NSLog(@"%@ ", "11111");
};
//調用
aBlock();
2.直接進行定義屬性,表達式賦值和調用也是類似的
聲明一個無返回值,參數為兩個字符串對象
Swift:有參無返回值類型,這些都差不多,重要的是在實際應用中進行應用
//tyBlock:閉包名稱.x,y:參數.Void:返回值
var tyBlock:((_ x:String,_ y:String)->Void)?
//小康括號里面是參數,in后面的是返回值,這是無返回值類型,所以進行了打印
self.tyBlock = {(x,y) in
print(x + y)
}
if tyBlock != nil {
tyBlock!("Mr","Kevin")
}
OC中:主要說明閉包blcok只是引用作用,賦值和調用就不在進行展示
void(^tyBlock)(NSString *x, NSString *y);
二. 實際應用
1.場景一自定義View上的點擊事件需要穿到控制器中
在View中聲明閉包,進行屬性定義,然后調用
typealias TYBlock = ()->()
var myBlock: TYBlock?
//xib拖拽的按鈕點擊方法
@IBAction func testBtnClick(_ sender: Any) {
if myBlock != nil {
myBlock!()
}
}
//控制器中的調用
let testView = TestView.init(frame: CGRect.init(x: 100, y: 400, width: 100, height: 100))
testView.myBlock = {
print("按鈕點擊")
}
self.view.addSubview(testView)
2.封裝網絡請求類,使用逃逸閉包在控制器中進行調用閉包獲得返回值(模擬)
//在網絡請求類中的代碼
class func requestData(handel:@escaping(_ reaData:AnyObject) -> Void) {
//請求接口所獲取的數組
let reaData = ["1","2","3","4","5"]
handel(reaData as AnyObject)
}
//在控制器中調用
TYNetWork.requestData { (model) in
print(model[2])
}
逃逸閉包的常用用途還有進行網絡請求以后加載UI
//控制器中添加代碼
func requestData(handel:@escaping(_ reaData:AnyObject) -> Void) {
let reaData = ["1","2","3","4","5"]
handel(reaData as AnyObject)
}
//控制器中進行調用賦值
self.requestData { (arr) in
print(arr[1])
}
水平有限,尾隨閉包,值捕獲,自動閉包還沒有怎么用過.
未完待續