0

次のような状況があります:(プレイグラウンドにコピーするだけです)

import Cocoa

protocol UID {
    var uid: Int {get set}
}

class A : UID {
    var uid = 01
}

class manageUID<T: UID> {

    let cache = NSCache()

    func addUID(aObj: T) {
        cache.setObject(aObj, forKey:aObj.uid)
    }

    func deletedUID(aObj: T) {
        cache.removeObjectForKey(aObj.uid)
    }
}

これにより、「setObject のオーバーロードが見つかりませんでした ...」というエラーが発生します。

問題は addUID の aObj のタイプであることはわかっていますが、コンパイラにとっては明確ではありません。

途中で言うだろう

func addUID(aObj: T) {
    cache.setObject(aObj as A, forKey:aObj.uid)
}

ただし、この場合、 a は一般的なトピックを完全にスキップできます。aObj を AnyObject や NSObject などにダウンキャストしようとしましたが、うまくいきませんでした。

何か案は?

汎用バージョンのキャッシュがあればいいのですが:)

アップデート:

解決策は、プロトコルに @objc 属性を追加することです。したがって、プロトコルはクラスに対してのみ使用できますが、これはプロトコルの一般的な制限につながります。クラスmanageUIDのローカルソリューションが好きです。

4

1 に答える 1