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 で「タイプ 'Model' はプロトコル 'Syncable' に準拠していません」というエラーが表示され続けます。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の世界に移動するとすぐに、プロトコル拡張は効果がなく、updateSyncState実装がないため、モデルは準拠しません。

于 2015-11-29T03:46:04.630 に答える