Тип «Any» не соответствует протоколу «Equatable» при попытке соответствия «Equatable» универсальному набору. - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать базовую структуру, которая поддерживает набор типов (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.

1 Ответ

0 голосов
/ 22 февраля 2019

AdjustmentSet сам по себе должен быть универсальным:

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

}

Но, конечно, Set - это структура, а не класс или протокол, поэтому он не может быть подобран таким образом.

...