【问题标题】:Mixing objective-c and swift: fatal error: use of unimplemented initializer 'init(target:action:)' for class混合objective-c和swift:致命错误:对类使用未实现的初始化程序'init(target:action :)'
【发布时间】:2015-10-06 08:24:28
【问题描述】:

我的代码同时包含objective-c 和swift 类,到目前为止,一切都运行良好。但是,我添加了一个继承自 UIGestureRecognizer 的自定义手势识别器。我的代码可以编译,但是当我尝试运行它时,出现以下错误:

    fatal error: use of unimplemented initializer 'init(target:action:)' for class 

我认为这个错误源于 Objective-c 和 swift 代码的混合,但我不知道如何解决它(除了用其中一种语言重写所有内容)。非常感谢您的帮助。

【问题讨论】:

  • 请提供您的手势识别码。
  • 您的视图控制器中是否有任何自定义初始化程序?如果是这样,请您尝试删除它们然后运行一次。
  • 这只是 UIKit 中方法的误导性声明。理想情况下,它应该已被声明为必需,并且您的运行时错误将替换为编译时错误。有关详细信息,请参阅下面的答案。

标签: objective-c swift uigesturerecognizer fatal-error


【解决方案1】:

这很正常,因为

init(target target: AnyObject?,
     action action: Selector) 

documentation 中作为指定的初始化程序公开。 然而,奇怪的是,在 UIKit 的公共资源中它是这样声明的:

public init(target: AnyObject?, action: Selector) // designated initializer

结论:即使它没有用required 关键字声明,你也必须为你的子类实现它。它可以简单地调用超级的init(target: AnyObject?, action: Selector)。 祝你好运。

【讨论】:

  • 非常感谢您的回答。我的子类已经有一个如下所示的 init:required init(target: AnyObject?, action: Selector, threshold: CGFloat) { NSLog("Init is called") self.threshold = threshold super.init(target: target, action: action) }
  • 现在可以用了吗?如果是,请将答案标记为已接受,以便每个人都能看到它解决了问题。
  • 不,不幸的是它没有。抱歉,我一开始没有提供关于我的子类的信息。
  • 如果您对此感到困惑,请随时在聊天中给我留言 (chat.stackoverflow.com/users/2799410/arthur-gevorkyan)。
  • 非常感谢您的帮助。我重写了我的代码,错误消失了!很高兴收到这么多有用的答案,我想我现在理解得更好了。
【解决方案2】:

延伸到 Arthur 提到的内容,这就是 Apple 为 init(coder aDecoder: NSCoder) 定义它的方式,使其需要子类来实现。

NSCoding 协议要求一致性类型实现 所需的初始化程序 init(coder:)。采用 NSCoding 的类 直接必须实现这个方法。采用的类的子类 具有一个或多个自定义初始化程序或任何属性的 NSCoding 没有初始值也必须实现这个方法。 Xcode 提供 以下修复它作为占位符实现:

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented") 
}

【讨论】:

  • 这有点离谱。不过信息量很大:)
猜你喜欢
  • 2019-04-23
  • 1970-01-01
  • 2014-07-25
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
相关资源
最近更新 更多