2014-11-16 4 views
3

Я использую MWPhotoBrowser в проекте Swift. Одна проблема заключается в том, что подкласс MWPhotoBrowser не будет компилироваться с такой ошибкой:Подклассы Objective-C классов в Swift

:0: error: cannot override 'init' which has been marked unavailable

Мой код здесь:

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; 

Переопределение этих инициализаторов в моем подклассе не помогает. Но если я создам подкласс MyBrowser в Objective-C, а затем подкласс этого класса, все работает нормально.

@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-intializers? Благодаря!

ответ

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

1

Кажется, строгость быстрых инициализаторов вызывает проблему. попытайтесь использовать NS_DESIGNATED_INITIALIZER, чтобы определить назначенный инициализатор в классе библиотеки object-c, решит эту проблему.

- (id)initWithPhotos:(NSArray *)photosArray __attribute__((deprecated("Use initWithDelegate: instead"))); // Depreciated 
- (id)initWithDelegate:(id <MWPhotoBrowserDelegate>)delegate NS_DESIGNATED_INITIALIZER; 
Смежные вопросы