Class-Swift 中仅通用约束
Class-only generic constraints in Swift
我正在尝试将泛型类型的变量标记为弱:
class X<T> {
weak var t: T?
}
如果我没有为 T
设置任何约束,我会得到错误 weak cannot be applied to non-class type 'T'
。
如果我只将它与 NSObject 派生的 classes 一起使用,这将有效:
class X<T: NSObject> {
weak var t: T?
}
但我也希望能够使用纯 Swift classes.
对于协议,可以通过使用 class
关键字要求实现者是 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 派生 classes:
extension NSObject: ClassType {
}
但是对于纯 Swift classes 来说,没有我可以添加此扩展的通用超级 class。有没有办法在不向我想使用 X
class 的每个 class 添加 ClassType
协议的情况下完成这项工作?例如。通用参数的一些特殊限定符,如 class X<T:ThisIsAClass>
?
您想要 AnyObject
,Swift 文档将其描述为:
The protocol to which all classes implicitly conform.
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>()
我正在尝试将泛型类型的变量标记为弱:
class X<T> {
weak var t: T?
}
如果我没有为 T
设置任何约束,我会得到错误 weak cannot be applied to non-class type 'T'
。
如果我只将它与 NSObject 派生的 classes 一起使用,这将有效:
class X<T: NSObject> {
weak var t: T?
}
但我也希望能够使用纯 Swift classes.
对于协议,可以通过使用 class
关键字要求实现者是 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 派生 classes:
extension NSObject: ClassType {
}
但是对于纯 Swift classes 来说,没有我可以添加此扩展的通用超级 class。有没有办法在不向我想使用 X
class 的每个 class 添加 ClassType
协议的情况下完成这项工作?例如。通用参数的一些特殊限定符,如 class X<T:ThisIsAClass>
?
您想要 AnyObject
,Swift 文档将其描述为:
The protocol to which all classes implicitly conform.
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>()