【问题标题】:Real world examples of @optional protocol methods@optional 协议方法的真实示例
【发布时间】:2009-07-09 10:06:38
【问题描述】:

我目前正在学习 Objective-C,并且遇到了协议中的可选方法。我的背景是 C#,可以将协议视为类似于 C# 接口的东西。

在 C# 接口代表合同的地方,通过宣传接口,您表示您将实现定义的方法。

考虑到这一点,我很困惑为什么您需要定义一个可选方法。这不是诽谤或试图减少 Objective-C,我喜欢 Objective-C。我只是想了解这些可选方法的好处,以便更好地了解该语言。

如果有人能提供一些可选方法有用的真实场景(带有示例代码),我将不胜感激。

【问题讨论】:

    标签: objective-c protocols optional


    【解决方案1】:

    我给你举个例子。我有许多与 Flickr API 对话的 ObjC 类。一个叫FKAccount 可以做很多与 Flickr 用户帐户相关的事情,包括下载用户的照片、获取他们的联系人列表等等。

    FKAccount 类定义了一个委托协议FKAccountDelegate。该协议指定了许多回调方法,FKAccount 将根据对 Flickr 的各种网络操作的成功或失败,在其委托上调用这些方法。并非每个使用 FKAccount 的应用程序都会对 FKAccount 可以执行的每个 Flickr 操作感兴趣。

    如果要求每个声称实现FKAccountDelegate 协议的类都实现每个方法,那么您最终会得到很多存根方法(FWIW,FKAccountDelegate 中定义了 41 个方法)。当这些方法在协议中声明为@optional时,委托只需要实现它有兴趣接收的回调。

    FKAccount 类通过以下方式检查其委托是否响应协议中的@optional 方法:

    if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) {
        [self.delegate accountDidDownloadContacts: self];
    }
    

    【讨论】:

    • 我想我现在明白了。 C# 接口只是 Objective-C 协议的一个方面。您可以将协议用作合同,但这些可选方法构成了对象也可以选择响应的可选委托列表。这真的很有趣。
    • 我完全同意@Tom。在 Objective-C 2.0 之前,委托方法通常在 NSObject 的一个类别中声明,以避免任何想要成为委托的类必须实现所有方法。协议中的可选方法是一种更简洁的解决方案,它不会将大量方法附加到 NSObject 上,并且有助于避免方法冲突。如果只有 Java 有可选的接口方法,就不需要从 MouseAdapter 继承之类的东西了。使用这样的类通常是我诅咒单继承的几次...... :-)
    猜你喜欢
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多