如何使用 Objective-C 代码桥接可抛出的 Swift 初始化程序?

Luk*_*asz 5 error-handling bridge initialization objective-c swift

假设我们有一个带有初始化器的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

产生编译警告:

<unknown>:0: warning: no calls to throwing functions occur within 'try' expression
Run Code Online (Sandbox Code Playgroud)

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

  • 通过用可init... -> throws失败的初始化器 ( )替换可抛出的初始化器( init?)
  • 放弃从子类化 NSObject

然而这样我会:

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

在此处输入图片说明

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

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

小智 2

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