我目前正在学习 Objective-C,并且在协议中遇到了可选方法。我的背景是 C#,可以将协议视为类似于 C# 接口的东西。
在 C# 接口代表合同的地方,通过宣传接口,您表示您将实现定义的方法。
考虑到这一点,我很困惑为什么您需要定义一个可选方法。这不是诽谤或试图减少 Objective-C,我喜欢 Objective-C。我只是想了解这些可选方法的好处,以便对语言有更深入的了解。
如果有人可以提供一些可选方法有用的真实世界场景(带有示例代码),我将不胜感激。
我目前正在学习 Objective-C,并且在协议中遇到了可选方法。我的背景是 C#,可以将协议视为类似于 C# 接口的东西。
在 C# 接口代表合同的地方,通过宣传接口,您表示您将实现定义的方法。
考虑到这一点,我很困惑为什么您需要定义一个可选方法。这不是诽谤或试图减少 Objective-C,我喜欢 Objective-C。我只是想了解这些可选方法的好处,以便对语言有更深入的了解。
如果有人可以提供一些可选方法有用的真实世界场景(带有示例代码),我将不胜感激。
我给你举个例子。我有许多与 Flickr API 对话的 ObjC 类。一,被叫FKAccount
可以做很多与 Flickr 用户帐户相关的事情,包括下载用户的照片、获取他们的联系人列表等。
该类FKAccount
定义了一个委托协议FKAccountDelegate
。该协议指定了许多回调方法,这些方法FKAccount
将根据对 Flickr 的各种网络操作的成功或失败对其委托进行调用。并非每个使用的应用程序都会对可以执行FKAccount
的每个 Flickr 操作感兴趣。FKAccount
如果要求每个声称实现FKAccountDelegate
协议的类都实现每个方法,那么您最终会得到很多存根方法(FWIW,在 中定义了 41 个方法FKAccountDelegate
)。当这些方法@optional
在协议中声明时,委托只需要实现它有兴趣接收的回调。
该类通过以下方式FKAccount
检查其委托是否响应@optional
协议中的方法:
if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) {
[self.delegate accountDidDownloadContacts: self];
}