Я пытаюсь создать базовую структуру, которая поддерживает набор типов (Int, Float, возможно строка, возможно иногда матрица Vec4).Я построил базовую структуру и согласовал ее с Hashable, сделал тип Equatable, но теперь мне нужно использовать эту новую структуру в наборе.
Эта строка:
struct AdjustmentSet: Set<BaseAdjustment<Any>>
гдеЯ объявляю, что структура для Set, выбрасывает
Тип 'Any' не соответствует протоколу 'Equatable'
Что, конечно, само по себе очевидно,но я не знаю, как на самом деле определить тип, который работает здесь (я пытался 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)
}
Приложение:
Я надеюсь, что с введением Opaque Types
в Swift 5 мы сможем обойти эту сложность, определив набор типа some BaseAdjustment
.