【问题标题】:How to bridge throwable Swift initialiser with Objective-C code?如何将可抛出的 Swift 初始化程序与 Objective-C 代码连接起来?
【发布时间】:2016-09-05 15:05:30
【问题描述】:

假设我们有一个带有初始化器的 Swift 类,它可能会引发错误。这个类必须在Objective-C代码库(NSObject子类)中使用:

import Foundation

enum EvenError : ErrorType {
    case NonEvenNumber
}

class FooEven : NSObject {
    var evenNumber : UInt

    init(evenNumber: UInt) throws {
        guard evenNumber % 2 == 0 else {
            throw EvenError.NonEvenNumber
        }
        self.evenNumber = evenNumber
    }
}

产生编译警告:

<unknown>:0: warning: no calls to throwing functions occur within 'try' expression

我可以通过两种方式解决此警告:

  • 通过将可抛出初始化器 (init... -&gt; throws) 替换为可失败初始化器 (init?)
  • 放弃从NSObject 子类化

但我会这样:

  • 有关导致异常的错误的松散信息,
  • 必须创建 FooEven 可选实例和/或处理许多:if let fooEven = FooEven.init() {...} 语句
  • ...否则我将无法在现有Objective-C 代码中使用它:

以上都不能满足我的需要/要求。

是否有其他方法可以在不丢失错误信息的情况下删除该警告?

【问题讨论】:

  • 你能使用一个包含 NSError 对象的闭包来捕获错误信息吗?抱歉,我对 Swift 了解不多。
  • 没有您的答案,但您解决过这个问题吗?遇到同样的问题。

标签: objective-c swift error-handling initialization bridge


【解决方案1】:

另一种解决方法是添加一个调用非抛出指定初始化程序的抛出便利初始化程序。

【讨论】:

    【解决方案2】:

    这是a bug in the Swift compiler,在 Xcode 8 中已修复。升级 Xcode 后,此警告将消失。

    与此同时,您可以在初始化程序结束时调用super.init(),这也会使警告消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多