代码之家  ›  专栏  ›  技术社区  ›  brandonscript

尝试符合可等式泛型集时,类型“Any”不符合协议“equalable”

  •  1
  • brandonscript  · 技术社区  · 7 年前

    我试图创建一个基本结构,它支持一组类型(Int、Float、可能是string,有时可能是Vec4-matrix)。我已经构建了一个基本结构,并将其与Hashable一致,使类型可平衡,但现在我需要在一个集合中使用这个新结构。

    这一行:

    struct AdjustmentSet: Set<BaseAdjustment<Any>>
    

    我为集合声明结构的地方是抛出

    类型“Any”不符合协议“equalable”

    这当然是显而易见的,但我不知道如何在这里定义一个有效的类型(我试过) 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 回复  |  直到 7 年前
        1
  •  1
  •   Alexander    7 年前

    AdjustmentSet 必须是通用的:

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

    但是当然, Set 是一个结构,而不是一个类或协议,所以不能这样子类型。