我在Swift项目中使用MWPhotoBrowser . 一个问题是MWPhotoBrowser的子类将无法编译并出现此类错误:
:0:错误:无法覆盖已标记为“不可用”的“init”
我的代码在这里:
class BrowseController: MWPhotoBrowser {
override init() {
super.init()
initialize()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
initialize()
}
...
以下是父类的所有初始值设定项:
// Init
- (id)initWithPhotos:(NSArray *)photosArray __attribute__((deprecated("Use initWithDelegate: instead"))); // Depreciated
- (id)initWithDelegate:(id <MWPhotoBrowserDelegate>)delegate;
在我的子类中覆盖这些初始化器并没有帮助 . 但是如果我在Objective-C中创建一个子类MyBrowser然后从这个类继承,那么一切正常 .
@interface MyBrowser : MWPhotoBrowser
- (id)init;
@end
@implementation MyBrowser
- (id)init {
if (self = [super init]) {}
return self;
}
@end
class BrowserController: MyBrowser {
...
我正在使用Xcode 6.1 . 这是一个Swift错误还是我错过了一些关于Swift初学者的东西?谢谢!
2 回答
似乎swift初始化程序的严格性导致了这个问题 . 尝试使用NS_DESIGNATED_INITIALIZER在objective-c库类中定义指定的初始化器将解决此问题 .
Chanitorn 's answer isn' t非常正确,因为
initWithDelegate:
不是MWPhotoBrowser的指定初始值设定项,init:
和initWithCoder:
是 . 诀窍是将它们添加到公共MWPhotoBrowser标头并将它们指定为NS_DESIGNATED_INITIALIZER
- (id)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; - (id)init NS_DESIGNATED_INITIALIZER;
Here's my PR