![](/img/trans.png)
[英]Protocols and delegation in swift 3 not sending values between viewcontrollers
[英]Understanding the Relation Between Delegation and Protocols
我知道這里有很多類似的問題,但是我仍然需要對此概念進行一些澄清。
首先,讓我首先說我確實了解什么是協議以及如何使用它們,我所遇到的問題是委派。 我確實理解委托是指程序中的一個對象代表另一個對象時,聽起來很簡單,但是很難看清整個畫面。
1-委托只是一種讓編譯器知道在哪里查找將要操作該對象的代碼的方法(UITableView等)嗎?
2-委托和協議可以一起工作嗎?
3-沒有協議就可以存在委派嗎? 如果是,請給我一個例子。
4-當我們聲明一個協議並且一個類符合它時,我們可以說這個符合協議的類是委派協議行為的嗎?
以上多少是正確的?
非常感謝
1-委托只是一種讓編譯器知道在哪里查找將要操作該對象的代碼的方法(UITableView等)嗎?
不,委托是一種設計模式。 這只是一個概念。
2-委托和協議可以一起工作嗎?
是的,他們在一起工作很好,對您的代表使用協議可能是最佳實踐。
3-沒有協議就可以存在委派嗎? 如果是,請給我一個例子。
是的你可以。 委托概念只是為了刪除對象的知識並將其放入委托中。 例如,一個UITableView
不知道它有多少行,或者當單擊一個單元格時不知道該怎么做,因此它詢問其委托。 但是委托仍然是另一個對象。
如果實現特定協議會更好,但是您可以不使用它。
舉個例子 :
我有一個MyView,它是MyCustomViewController
的子視圖。
MyCustomViewController.h
- (void)myViewIsTouched;
MyView.h
@property (nonatomic, weak) MyCustomViewController *delegate
MyView.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.delegate myViewIsTouched];
}
此示例中沒有協議,但它仍然是委托。 (更好的方法仍然是使用協議,而不是在.h
中聲明方法)
4-當我們聲明一個協議並且一個類符合它時,我們可以說這個符合協議的類是委派協議行為的嗎?
我不知道在說什么。 但是協議和委托不是同一回事。 實現協議的對象並不意味着它是委托。
委托使對象能夠根據應用程序其他部分的更改來更改其外觀/狀態。 在對象上設置delegate
屬性將允許編譯器在構建時進行一些檢查。
委托通常通過使用協議來實現,因為它允許委托對象屬於任何類,而不是具有特定行為的類的子類。
是的,但是這會導致您的班級緊密耦合,因為Foo
需要了解Bar
,反之亦然。 使用協議允許您使用任何類,因此可以使用id
屬性,從而導致系統松耦合。
例:
@class Foo;
@interface Bar : NSObject
- (void)respondToSomeAction:(Foo *)obj;
@end
@implementation Bar
- (void)respondToSomeAction:(Foo *)obj {
NSLog("responding to %@",obj);
}
@end
@interface Foo : NSObject
@property (nonatomic, weak) Bar *delegate
@end
@implementation Foo
- (void)someActionTriggered {
[self.delegate respondToSomeAction:self]
}
@end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.