Swift 2 - @objc协议抛出错误

5

我在一个需要使用@objc标记协议的Swift项目中使用台风。我试图将我的项目升级到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类无法使用错误处理符合Objective-C协议"

所以,我尝试了以下内容:

@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协议没有意义... - nhgrif
台风和协议中的@objc限制。这里的答案解释了为什么Typhoon需要它(来自其中一位贡献者)。如果我能以Objective-C友好的方式格式化方法签名,那么我所提到的链接似乎应该可以工作。但我还没有找到正确的格式。 - Barger27
1个回答

2

很遗憾,根据我今天的研究,我相信Swift 2风格的异常与Objective-C不兼容,因此无法与Typhoon一起使用。


谢谢您的回复!编译器说动态不适用于协议函数,并要求我将其删除。将其添加到实现函数中会产生相同的结果。 - Barger27
哎呀,好的。再看一遍,我现在认为这可能与Swift和ObjC风格的throws有关,但无论如何,我会安排时间进行适当的分析,并提供详细的建议。 - Jasper Blues
更新:我认为Swift 2风格的异常与Typhoon使用的旧版ObjC运行时不兼容。 - Jasper Blues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接