1

我有这样的设置:

@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 说“类型'模型'不符合协议'同步'”。Xcode 还一直建议我@objc在扩展程序中放置一个位置,但它似乎无法弄清楚它应该放在哪里。

我正在做的事情是不可能的吗?(它似乎在操场上的简单条件下工作 - 但显然我的 Objective-C 类是用 Swift 编写的)。

如果不可能,请帮助理解为什么会受到赞赏。

4

1 回答 1

1

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

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 [:]
    }
}

那是因为 Swift 知道什么是协议扩展。但是Objective-C没有!因此,一旦您说@objc protocol您将协议移入 Objective-C 世界,并且协议扩展没有任何效果 - 因此 Model 不符合要求,因为它没有updateSyncState实现。

于 2015-11-29T03:46:04.630 回答