21

我试图将泛型类型的变量标记为弱:

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>

4

1 回答 1

29

你想要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>()
于 2015-03-05T18:21:30.973 回答