Swift中仅限类的泛型约束

las*_*sej 21 generics protocols class swift anyobject

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

class X<T> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

如果我没有提出任何约束T我得到错误weak cannot be applied to non-class type 'T'.

如果我只使用这个与NSObject派生类,这将工作:

class X<T: NSObject> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

但我也希望能够使用纯Swift类.

对于协议,可以通过使用class关键字要求实现者具有类类型:

protocol ClassType: class {
}
Run Code Online (Sandbox Code Playgroud)

根据ClassType协议,我现在可以将变量标记为弱:

class X<T: ClassType> {
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

但我不能class直接将关键字添加到泛型参数:

class X<T: class> { // Compile error
  weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)

我可以使协议解决方案适用于具有扩展名的所有NSObject派生类:

extension NSObject: ClassType {
}
Run Code Online (Sandbox Code Playgroud)

但是对于纯Swift类,我没有可以添加此扩展的常见超类.有没有办法让这项工作没有将ClassType协议添加到我想要使用X该类的每个类?例如,泛型参数的一些特殊限定符如class X<T:ThisIsAClass>

Air*_*ity 28

你想要的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>()
Run Code Online (Sandbox Code Playgroud)

  • **找到答案:** 您需要将 `@objc` 属性添加到协议声明中,它也能正常工作 `@objc protocol Interface: class { }` (3认同)
  • 有没有办法让它与具有类绑定的协议一起工作?(例如,为了能够创建`protocol Interface:class {}`然后创建子类`class Y:X <Interface> {}`) (2认同)