我正在尝试创建一个支持一组类型(Int,Float,也许是字符串,有时是Vec4矩阵)的基本结构。我已经构建了一个基本结构并将其符合Hashable,将类型设置为Equatable,但是现在我需要在Set中使用这个新结构。
此行:
struct AdjustmentSet: Set<BaseAdjustment<Any>>
我声明Set的结构的地方正在抛出
类型“任何”都不符合协议“平等”
这当然是显而易见的,但是我不知道如何在这里实际定义一个有效的类型(我尝试过T: Equatable
,Equatable
,但没有任何作用)。
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)
}
答案 0 :(得分:1)
AdjustmentSet
必须本身是通用的:
struct AdjustmentSet<T: Equatable>: Set<BaseAdjustment<T>> {
}
但是当然,Set
是一个结构,而不是类或协议,因此不能像这样子类型化。