對于初學者來說delegate或block都不是一下子能理解的芬骄,所以我的建議和體會就是,理不理解咱先不說鹦聪,我先把這個格式記住账阻,對就是格式,delegate或block都是高度格式化的泽本,用的多了自然而然不理解也就理解了
場景:從 B -> A 傳值淘太,開發(fā)中必不可少的業(yè)務需求,經(jīng)常會有在B頁面干完一些事情之后告訴A頁面或者傳值到A頁面规丽。
本文主要簡單說明一OC和Swift 中的 delegate和block
1.block的書寫對比
2.delagete的書寫對比
第一個問題:block的使用(oc的代碼的1和2是寫在.h中的)
1.首先在B的controller中聲明
//swift
typealias TestBlock = (String,String)->Void
//oc
typedef void (^block)(NSString *str1,NSString *str2);
2.在B的controller中定義這個block
//swift
var block: TestBlock?
//oc
@property (copy, nonatomic) block bolck;
3.在B的controller里面調(diào)用這個block
//swift
self.block!("我是第一個參數(shù)","我是第二個參數(shù)");
//oc
self.bolck(@"第一個參數(shù)", @"第二個參數(shù)");
4.在A的controller里面監(jiān)測B中block傳遞的值
//swift
let vc = SecondViewController();
vc.block = {
(str1: String,str2:String) -> Void in
print(str1+str2)
}
//oc
vc.bolck = ^(NSString *str1,NSString *str2){
NSLog(@"%@==%@",str1,str2);
};
第二個問題:delegate 的使用
1.首先在B的controller中定義一個協(xié)議
//swift
protocol TestDelaget {
func testDelagetMethod(str:String) ->Void
}
//oc
@protocol ViewControllerDelagete
@optional
- (void)testDelagete:(NSString *)str;
@end
2.在B的controller中聲明這個delegate
//swift
var delegate: TestDelaget?
//oc
@property (assign, nonatomic) id delagete;
3.在B的controller中調(diào)用
//swift
self.delegate?.testDelagetMethod(str: "這個代理傳遞的值");
//oc
if ([self.delagete respondsToSelector:@selector(testDelagete:)]) {
[self.delagete testDelagete:@"我是代理傳遞的值"];
}
3.在A的controller中實現(xiàn)方法(別忘了設置代理)
//swift
func testDelagetMethod(str: String) {
print("test delegate---\(str)")
}
//oc
- (void)testDelagete:(NSString *)str{
NSLog(@"%@",str);
}
注:
1.swift 的demo下載地址:https://github.com/xiaoshunliang/SwiftTestBlock
2.OC的demo下載地址https://github.com/xiaoshunliang/OcTestBlock
想了解更多適合新手的內(nèi)容可以關注下面的團隊號(名字都是浮云,內(nèi)容才是重點)
訂閱號.jpg