2015-08-25 62 views
4

我在需要协议标记为@objc的Swift项目中使用Typhoon。我试图将我的项目升级到Swift 2.Swift 2 - @objc引发错误的协议

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

Type 'ErrorThrower' does not conform to protocol '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 
} 

是什么在斯威夫特2有道宣布与@objc的协议,并扔在方法是错误的?

+0

关于为什么Typhoon需要'@ objc'协议的更多信息可能与此处有关。我认为'@ objc'协议'不合理'... – nhgrif

+0

[协议中的台风和@objc限制](http://stackoverflow.com/questions/31661815/typhoon-and-objc-limitation- in-protocols)这里的答案解释了为什么Typhoon需要它(来自其中一个贡献者)。似乎如果我可以用友好的Objective-C方式格式化方法签名,那么我提到的链接应该可以工作。但我还没有找到正确的格式。 – Barger27

回答

2

不幸的是,从我今天研究的内容来看,我认为Swift 2风格的异常与Objective-C不兼容,因此不适用于Typhoon。

+0

感谢您的回应!那么,编译器说动态不适用于协议功能,并让我删除它。将它添加到实现函数中会产生相同的结果。 – Barger27

+0

哎呀,好的。再看看,我现在认为它与Swift和ObjC风格的投入有关,但无论如何,我会安排一些时间做适当的分析并提供详细的建议。 –

+0

更新:我相信Swift 2风格的异常不会与Typhoon使用的传统ObjC运行时相处得很好。 –