我有一个类似于这个的泛型类:
class C<T: Equatable> {
let t: T
init(t: T) {
self.t = t
}
}
当我尝试将Int?
包裹在里面时,我收到以下错误:
// ERROR: Type "Int?" does not conform to protocol 'Equatable'
let c = C<Int?>(t: nil)
快速测试显示Int?
确实是Equatable
:
let a: Int? = 5
let b: Int? = 6
let c = a == b // NO ERROR
也许我今天太累了?
答案 0 :(得分:5)
您需要T
为Equatable
。
但是你传递Int?
(Optional<Int>
的简写符号),而不是Equatable
。
您可以在查看Optional
public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible
没有Equatable
。即使_Reflectable
和NilLiteralConvertible
不 Equatable
。
那么为什么您的测试似乎证明Int?
确实是Equatable
?
let a: Int? = 5
let b: Int? = 6
let c = a == b // NO ERROR
实际上这并不意味着Int?
是Equatable
。事实上,你正在调用这个函数
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
您可以看到该功能需要T
为Equatable
。
由于T
和T?
完全不同类型,因此这并不意味着T?
也是Equatable
。
答案 1 :(得分:2)
您必须指定您的泛型类型是可选的,如下所示:
{{1}}