尝试符合相等的通用集时,类型“任何”均不符合协议“相等”

时间:2019-02-22 02:30:25

标签: ios swift generics set

我正在尝试创建一个支持一组类型(Int,Float,也许是字符串,有时是Vec4矩阵)的基本结构。我已经构建了一个基本结构并将其符合Hashable,将类型设置为Equatable,但是现在我需要在Set中使用这个新结构。

此行:

struct AdjustmentSet: Set<BaseAdjustment<Any>>

我声明Set的结构的地方正在抛出

  

类型“任何”都不符合协议“平等”

这当然是显而易见的,但是我不知道如何在这里实际定义一个有效的类型(我尝试过T: EquatableEquatable,但没有任何作用)。

struct BaseAdjustment<T: Equatable>: Hashable {

    var hashValue: Int {
        return displayName.hashValue
    }

    static func == (lhs: BaseAdjustment<T>, rhs: BaseAdjustment<T>) -> Bool {
        return lhs.displayName == rhs.displayName &&
            lhs.value == rhs.value &&
            lhs.isApplied == rhs.isApplied
    }

    var min: T?
    var max: T?
    var displayName: String = ""
    var value: T?
    var defaultValue: T?
    var isApplied: Bool = true

    init(min: T, max: T, displayName: String, defaultValue: T?) {
        self.min = min
        self.max = max
        self.displayName = displayName
        self.defaultValue = defaultValue
        self.value = defaultValue
        self.isApplied = true
    }
}

struct AdjustmentSet: Set<BaseAdjustment<Any>> {
    static var brightness   = BaseAdjustment<CGFloat>(min: 0, max: 1, displayName: "Brightness", defaultValue: 0)
    static var exposure     = BaseAdjustment<CGFloat>(min: 0, max: 1, displayName: "Exposure", defaultValue: 0)
    static var contrast     = BaseAdjustment<CGFloat>(min: 0, max: 1, displayName: "Contrast", defaultValue: 0)
}

1 个答案:

答案 0 :(得分:1)

AdjustmentSet必须本身是通用的:

struct AdjustmentSet<T: Equatable>: Set<BaseAdjustment<T>> {

}

但是当然,Set是一个结构,而不是类或协议,因此不能像这样子类型化。