针对Objective-C类型的Swift 2协议扩展和一致性

针对Objective-C类型的Swift 2协议扩展和一致性,objective-c,swift,protocol-extension,Objective C,Swift,Protocol Extension,我有这样的设置: @interface Model: NSManagedObject ... @end 还有像这样的Swift协议: @objc protocol Syncable { var uploadURL: String { get } var uploadParams: [String: AnyObject]? { get } func updateSyncState() throws } extension Syncable where Self: NSM

我有这样的设置:

@interface Model: NSManagedObject
...
@end
还有像这样的Swift协议:

@objc protocol Syncable {
    var uploadURL: String { get }
    var uploadParams: [String: AnyObject]? { get }
    func updateSyncState() throws
}

extension Syncable where Self: NSManagedObject {
    func updateSyncState() throws {
        ... /* default implementation */ ...
    }
}
在新的Swift文件中,我尝试这样做:

extension Model: Syncable {
    var uploadURL: String {
        return "a url"
    }
    var uploadParams: [String: AnyObject]? {
        return [:]
    }
}
我一直收到一个错误,Xcode说“type'Model'不符合协议'Syncable'”。Xcode还一直建议我在扩展中的某个地方放一个
@objc
,但它似乎不知道应该放在哪里

我所做的是不可能的吗?(在操场上,它似乎在简单的条件下工作——但我的Objective-C课程显然是用Swift编写的)


如果不可能,请帮助理解原因。

问题在于试图混合Objective-C和Swift功能。这段纯Swift代码编译得很好(请注意,我已经从故事中删除了NSManagedObject,因为它与问题无关):


这是因为斯威夫特知道什么是协议扩展。但是Objective-C没有!所以,只要你说
@objc协议
你就把协议移动到Objective-C世界,协议扩展没有效果-因此模型不符合,因为它没有
更新同步状态
实现。

好吧。。。你是对的。但有趣的是,在我的游乐场上,我有一些和你发布的内容非常相似的东西,但我的协议有
@objc
,并且仍然有效。好吧,游乐场不是一个应用程序。在操场上测试某些东西确实会误导人。我总是在真正的应用程序中测试。
class MyManagedObject {}

class Model: MyManagedObject {}

protocol Syncable {
    var uploadURL: String { get }
    var uploadParams: [String: AnyObject]? { get }
    func updateSyncState()
}

extension Syncable where Self: MyManagedObject {
    func updateSyncState() {
    }
}

extension Model: Syncable {
    var uploadURL: String {
        return "a url"
    }
    var uploadParams: [String: AnyObject]? {
        return [:]
    }
}