er.*_*app 55 delegates protocols objective-c ios
a protocol
和a有delegate
什么区别?
和,
我们怎样才能声明variables
中protocol class
?
Jam*_*ord 79
使用(@protocol
Objective-C中的语法)声明的协议用于声明一组类"采用"(声明它将使用此协议)将实现的方法.这意味着您可以在代码中指定"只要它实现特定协议,您就不关心使用哪个类".这可以在Objective-C中完成,如下所示:
id<MyProtocol> instanceOfClassThatImplementsMyProtocol;
如果在代码中说明了这一点,那么"符合"协议MyProtocol的任何类都可以在变量instanceOfClassThatImplementsMyProtocol中使用.这意味着使用此变量的代码知道它可以使用MyProtocol中定义的任何方法与此特定变量,无论它是什么类.这是避免继承设计模式和避免紧耦合的好方法.
代表使用协议的语言功能.该代表团设计模式是在设计你的代码在必要时使用协议的方式.在Cocoa框架中,委托设计模式用于指定符合特定协议的类的实例.此特定协议指定委托类应在给定事件中执行特定操作的方法.使用委托的类知道它的委托符合协议,因此它知道它可以在给定时间调用已实现的方法.这种设计模式是解耦类的好方法,因为它使得将一个委托实例交换为另一个委托实例变得非常容易 - 程序员必须做的就是确保替换实例或类符合必要的协议(即它实现了协议中指定的方法)!
协议和委托不仅限于Objective-C和Mac/iOS开发,而Objective-C语言和Apple框架大量使用这种令人敬畏的语言特性和设计模式.
编辑:
这是一个例子.在Cocoa Touch的UIKit框架中,有一个UITextFieldDelegate协议.该协议定义了一系列方法,这些方法是UITextField实例的委托应该实现的.换句话说,如果要将委托分配给UITextField(使用delegate
属性),则最好确保此类符合UITextFieldDelegate.实际上,因为UITextField的delegate属性定义为:
@property(nonatomic, weak) id<UITextFieldDelegate> delegate
然后,如果为其分配一个未实现协议的类,编译器将发出警告.这非常有用.你必须声明一个类实现了一个协议,并且说它确实存在,你让其他类知道它们可以以特定的方式与你的类进行交互.所以,如果你指定的实例MyTextFieldDelegateClass到delegate
财产的UITextField,该的UITextField 知道,它可以调用一些特定的方法你的(以文本输入,选择等相关)MyTextFieldDelegateClass.它知道这一点,因为MyTextFieldDelegateClass已经表示它将实现UITextFieldDelegate协议.
最终,这一切都会为您的项目代码带来更大的灵活性和适应性,我相信您在使用这项技术后很快就会意识到这一点!:)
Sur*_*mas 13
代表团:代表另一个对象(oops中的设计模式)
它是一种设计模式,其中一个名为委托的对象代表另一个对象并在另一个对象的请求下起作用.在执行的某个时刻,它向其委托发送一条消息; 消息告诉委托,某些事件即将发生并请求一些响应.委托实现消息调用的方法并返回适当的值
一个例子是appdelegate对象代表appobject.
协议:启用与继承无关的对象之间的通信
协议是程序接口的声明,其任何类都可以实现.方案是客观的c 语言特性.简单地说是任何类都可以实现的方法列表.要使用它,你需要确认协议.示例是UITableviewDatasource协议,其方法cellforRowAtIndexPath在协议中声明,但我们实现它以创建tableview.
一个我 mportant p rerequisite是理解协议˚F IRST 然后代表.我建议你先看看这个简短的教程,然后看看 什么是协议?.此外,您必须知道类和协议之间的区别,所以请参阅Objective-C:类与协议以及协议的重点是什么?.
protocol:
只是实现功能的蓝图.任何采用该蓝图的类都必须实现这些功能.(不要误认为通过调用函数实现函数)
delegate:
1是你还做什么delegat- ING类是做不 继承如
例如,你有一个viewController并且想要下载图像,或者你想让顾客与商店保持距离,所以不要自己做所有这些,而是只有一个中等对象为你做.该对象称为委托对象.通常你会这样做:
class ViewController : UIViewController , DownloaderDelegate{
//other code
// inside viewDidLoad or elsewhere you write:
downloaderHandler.delegate = self // now self can also use whatever the delegating object gives it...previously it was only a viewController but now it's 'almost' also a downloader
Run Code Online (Sandbox Code Playgroud)
与符合tableViewDelegate的操作非常相似
class ViewController : UIViewController , UITableViewDelegate{
//other code
// inside viewDidLoad or elsewhere you write
tableView.delegate = self
Run Code Online (Sandbox Code Playgroud)
你self
现在也可以做tableView相关的东西.
delegate:
2
但是该对象(委托)是一个简单的vanilla对象(id或Any).真笨!你必须告诉它: "嘿,你需要工作才能拥有符合我们为你定义的协议所需的特定功能.(我们不会扩展任何或id,因为那将是愚蠢的,(相反)我们做了一个非常明确的限制协议"
在Objective-C中它是一个纯粹的香草id
,所以你这样做
@property (weak) id<DownloaderProtocol>delegate;
Run Code Online (Sandbox Code Playgroud)
在Swift *中,你做的稍微容易一些:
weak var delegate:DownloaderProtocol?
Run Code Online (Sandbox Code Playgroud)
协议来拯救...委托实现(不使用)函数,但它适合您的委托类的需要.
*:在Swift中你还没有id
你不需要它的等价物,Any
因为在Swift协议中它也是一流的公民类型
我们可以说协议是一组规则。该规则可以是可选的或必需的,就像我们必须在协议中使用一样。
Delegates是Objective C 和swift 中的一种消息传递技术。对象必须处理该消息。
例如:每个 iOS 开发人员曾经使用的一个简单示例是 UITableview,在创建表时,您必须实现,cellForRowAtIndexPath()
并且numberOfRowsInSection()
在您的控制器中,规则(协议)根据需要在 UItableview 类中定义,这是一个 requires协议。
还有其他类似的协议heightForRowAtIndexPath()
是可选的。
现在来到UITableView 中的委托,有一个方法(消息)didSelectRowAtIndexPath()
可以向您发送事件消息。如果您将委托设置为 self,则意味着您的控制器已准备好处理该事件。
这个术语对于开发者来说似乎更令人困惑,因为我们习惯性地将它一起使用(:
享受!!!!
归档时间: |
|
查看次数: |
47990 次 |
最近记录: |