objective-c - 如何将可抛出的 Swift 初始化程序与 Objective-C 代码桥接?

标签 objective-c swift error-handling initialization bridge

假设我们有一个带有初始化器的 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... -> throws) 替换为可失败初始化器 (init?)
  • 放弃从 NSObject 继承子类

但是这样我会:

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

enter image description here

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

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

最佳答案

另一种解决方法是添加一个抛出便利构造器来调用非抛出指定构造器。

关于objective-c - 如何将可抛出的 Swift 初始化程序与 Objective-C 代码桥接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37141867/

相关文章:

iphone - 如何重命名我的项目?

c++ - 在 iOS 应用程序中从 C++ 通知 UI

objective-c - 工作区缺少工作副本中的链接文件

ios - SpriteKit 黑屏

c++ - 使用If语句检测整数溢出

ios - 从 NSArray 中移除对象

ios - 当用户允许位置跟踪时更新位置

ios - 注释不会出现在 MapView 上

struts2 - NPE为什么会导致JVM崩溃?

python - python错误检查