Swift:Generics&向下转向AnyObject

时间:2014-06-26 05:52:14

标签: generics swift nscache

我有以下情况:(只需将其复制到游乐场)

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)
    }
}

这会导致错误&#34;无法找到setObject的重载...&#34;

我知道问题是addUID中的aObj类型,编译器不清楚。

在途中就是说

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

但在这种情况下,可以完全跳过通用主题。我尝试将aObj向下转换为类似AnyObject或NSObject的东西,但它不起作用。

有什么想法吗?

我很高兴有一个通用版本的缓存:)

更新:

解决方法是在协议上添加@objc属性,因此该协议仅可用于类,但这会导致协议的一般限制。我只是喜欢类manageUID中的本地解决方案。

1 个答案:

答案 0 :(得分:0)

我找到了另一个解决方案,主要来自我的问题的答案: https://devforums.apple.com/thread/233432

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

 @class_protocol
 protocol ObjectUID : UID {

 }


 class manageUID<T: ObjectUID> {

    let cache = NSCache()

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

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