【问题标题】:Swift 2 - @objc Protocol that throws an ErrorSwift 2 - 引发错误的 @objc 协议
【发布时间】:2015-11-18 15:52:02
【问题描述】:

我在 Swift 项目中使用 Typhoon,该项目需要使用 @objc 标记协议。我正在尝试将我的项目升级到 Swift 2。

在我的 iOS 应用程序中,我的服务层将错误返回给 UI。然而,尽管我尽了最大努力,我还是得到了一个编译错误:

类型“ErrorThrower”不符合协议“Throwable”

@objc protocol Throwable {
    func doSomething(someParam:AnyObject) throws
}

@objc class ErrorThrower : NSObject, Throwable {
    func doSomething(someParam: AnyObject) throws {
        NSLog("An error is about to be thrown")
        throw GenericError.Generic
    }
}

enum GenericError : ErrorType {
    case Generic
}

我看到了这个帖子“Swift class does not conform to Objective-C protocol with error handling

所以,这让我尝试了这样的事情:

@objc protocol Throwable {
    func doSomething(someParam:AnyObject) throws
}


class ErrorThrower : NSObject, Throwable {     
    @objc(doSomethingAndReturnError:someParam:)
    func doSomething(someParam: AnyObject) throws {
        NSLog("An error is about to be thrown")
        throw GenericError.Generic
    }
}

它没有抱怨实现上的@objc(...),但它仍然给出相同的不符合协议错误。

我也试过这个,但没有运气......

@objc protocol Throwable {
    func doSomethingAndReturnError(error:NSErrorPointer, someParam:AnyObject) -> Bool
}

在 Swift 2 中使用 @objc 声明协议并在方法上抛出错误的正确方法是什么?

【问题讨论】:

  • 更多关于 Typhoon 为什么需要@objc 协议的信息可能与此处相关。我不认为throws@objc 协议有意义...
  • Typhoon and @objc limitation in protocols 这里的答案解释了为什么 Typhoon 需要它(来自一位贡献者)。似乎如果我可以以一种客观 c 友好的方式格式化方法签名,我提到的链接应该可以工作。但是我还没有找到合适的格式。

标签: objective-c swift interop swift2 typhoon


【解决方案1】:

不幸的是,根据我今天的研究,我认为 Swift 2 样式异常与 Objective-C 不兼容,因此不适用于 Typhoon。

【讨论】:

  • 感谢您的回复!好吧,编译器说动态不适用于协议函数并让我删除它。将其添加到实现函数会产生相同的结果。
  • 糟糕,好的。再看一遍,我现在认为这与 Swift 与 ObjC 风格的投掷有关,但无论如何我会安排一些时间进行适当的分析并提供详细的建议。
  • 更新:我相信 Swift 2 风格的异常不会与 Typhoon 使用的旧版 ObjC 运行时很好地相处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
相关资源
最近更新 更多