对于初始化者,我可以批准我发现Objective-c的继承有多糟糕,但我不会。在这种情况下,我只想重新定义一个先前由父类声明为NS_UNAVAILABLE
的初始化器。如:
@interface Parent : NSObject
// Unavailable
- (instancetype)init NS_UNAVAILABLE;
// Some other (appropriate) initialiser
- (instancetype)initWithWhatever:(id)whatever NS_DESIGNATED_INITIALIZER;
@end
对儿童初始化者的任何调用都需要传播到父指定的初始化者是有意义的。让我们说默认参数在子类上是有意义的,因此:
@interface Child : Parent
// Propagates to initWithWhatever:
- (instancetype)init NS_DESIGNATED_INITIALIZER;
@end
即使初始化程序被子类重新声明,xcode似乎仍然认为它不可用。有办法解决这个问题吗?
答案 0 :(得分:0)
在 Xcode 8 (在8.1中测试)中看起来已修复此行为。
我也有一些注意事项:
要使Artist
实施完全完成,您应该覆盖Child
或使其不可用。因为initWithWhatever
当然会从Child
继承此初始值设定项。
如果您Parent
无效,则init
也不可用。
因此。从现在起,我们可以在new
&帮助下完全控制我们的初始值设定项。 Objective-C 中的NS_DESIGNATED_INITIALIZER
组合。与 Swift 相比,它需要更多的工作,但这是值得的。特别是如果你想让你的课程与Swift更好地兼容。