【发布时间】:2013-09-02 19:54:38
【问题描述】:
如果你尝试混合类和协议,在 Objective-C 中意味着什么?如果类不符合协议,我试图让编译器在编译器时警告我。例如:
@protocol FLLiveDataProtocol <NSObject>
...
@end
- (id)initWithDataPath:(NSString *)path usingDataClassFactory:(Class<FLLiveDataProtocol>)dataFactoryClass;
但是,当我尝试这个时,我遇到了各种有趣的问题。首先,如果您传入一个不符合协议的类,它不会触发编译器错误,其次,如果您尝试执行 [[dataFactoryClass] alloc] init] 即使通过协议也符合 NSObject。
我没有看到很多人试图混合协议和 Class 关键字的例子(我应该说 Typedef -- 感谢 Nikolai)。
我知道我可以使用 conformsToProtocol 在运行时检查,但如果我能在编译时检查它会很好。
【问题讨论】:
-
实际上,conformsToProtocol 在运行时甚至不会告诉你——因为你需要在每个相关方法上执行 respondsToSelector。 (这是“鸭子打字”的背面——知道它不是鸭子的唯一方法是注意它看起来不像鸭子、走路或嘎嘎声。)
-
我认为您试图解决错误的问题。为什么你的数据工厂必须是一个类?如果你是一个实例会容易很多吗?
-
我使用的是标准工厂模式,因为我需要它根据给定的工厂类创建多个实例。
-
我在协议中使用了@required 关键字(上面没有显示),所以如果它没有实现预期的方法,我会得到一个编译时错误。这让我在使用 conformsToProtocol 时感到相当舒适。
标签: objective-c