次のような状況があります:(プレイグラウンドにコピーするだけです)
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のローカルソリューションが好きです。