【问题标题】:Subclassing Objective-C Classes in Swift在 Swift 中子类化 Objective-C 类
【发布时间】:2014-11-16 14:43:14
【问题描述】:

我在 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 初始化程序的东西?谢谢!

【问题讨论】:

    标签: ios objective-c swift


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-01-09
        • 2020-10-29
        • 2014-08-03
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        相关资源
        最近更新 更多