在Swift中对Objective-C类进行子类化

时间:2014-11-16 14:43:14

标签: ios objective-c swift

我在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 个答案:

答案 0 :(得分:1)

似乎swift初始化程序的严格性导致了这个问题。 尝试使用NS_DESIGNATED_INITIALIZER在objective-c库类中定义指定的初始化器将解决这个问题。

- (id)initWithPhotos:(NSArray *)photosArray  __attribute__((deprecated("Use initWithDelegate: instead"))); // Depreciated
- (id)initWithDelegate:(id <MWPhotoBrowserDelegate>)delegate NS_DESIGNATED_INITIALIZER;

答案 1 :(得分:1)

Chanitorn的答案不太正确,因为initWithDelegate:不是MWPhotoBrowser的指定初始化程序,init:initWithCoder:。诀窍是将它们添加到公共MWPhotoBrowser标头并将其指定为NS_DESIGNATED_INITIALIZER

- (id)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; - (id)init NS_DESIGNATED_INITIALIZER;

Here's my PR