我正在尝试将泛型类型的变量标记为弱:
class X<T> {
weak var t: T?
}
如果我没有为T
设置任何限制,我会收到错误weak cannot be applied to non-class type 'T'
。
如果我只使用这个与NSObject派生类一起使用,那么这将起作用:
class X<T: NSObject> {
weak var t: T?
}
但我也希望能够使用纯粹的Swift类。
对于协议,可以使用class
关键字要求实现者具有类类型:
protocol ClassType: class {
}
使用ClassType
协议,我现在可以将变量标记为弱:
class X<T: ClassType> {
weak var t: T?
}
但我无法将class
关键字直接添加到通用参数:
class X<T: class> { // Compile error
weak var t: T?
}
我可以使协议解决方案适用于具有扩展名的所有NSObject派生类:
extension NSObject: ClassType {
}
但是对于纯Swift类,我没有可以添加此扩展的常见超类。有没有办法让这项工作没有将ClassType
协议添加到我想要使用X
类的每个类?例如。泛型参数的一些特殊限定符,如class X<T:ThisIsAClass>
?
答案 0 :(得分:26)
你想要AnyObject
,Swift文档描述为:
所有类隐式符合的协议。
class X<T: AnyObject> {
weak var t: T?
}
class C { }
let x = X<C>() // works fine
x.t = C()
// error: type 'Int' does not conform to protocol ‘AnyObject’
// (because Int is a struct)
let y = X<Int>()