输入" T?"不符合协议' Equatable'

时间:2016-02-29 14:34:17

标签: swift

我有一个类似于这个的泛型类:

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

也许我今天太累了?

2 个答案:

答案 0 :(得分:5)

诠释?不等于

您需要TEquatable

但是你传递Int?Optional<Int>的简写符号),而不是Equatable

可选声明

您可以在查看Optional

的来源声明时进行验证
public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible

没有Equatable。即使_ReflectableNilLiteralConvertible 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

您可以看到该功能需要TEquatable。 由于TT? 完全不同类型,因此这并不意味着T?也是Equatable

答案 1 :(得分:2)

您必须指定您的泛型类型是可选的,如下所示:

{{1}}