键入任何 <Protocol> 不能符合 Hashable

Mar*_*tin 13 generics protocols swift

我正在使用 Swift 5.7 新功能,并尝试实现一些异构集。

我已将代码简化为这个简单的游乐场:

protocol Stuff: Hashable {
    var identifier: String { get }
}

struct StuffA: Stuff {
    let identifier: String
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(identifier)
    }
}

struct StuffB: Stuff {
    let identifier: String
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(identifier)
    }
}

var arrayOfStuff: Array<any Stuff> = []
arrayOfStuff.append(StuffA(identifier: "a"))
arrayOfStuff.append(StuffB(identifier: "b"))
// Works like a charm

var setOfStuff: Set<any Stuff> = Set() 
// error: Type 'any Stuff' cannot conform to 'Hashable'
setOfStuff.insert(StuffA(identifier: "a"))
setOfStuff.insert(StuffB(identifier: "b"))
Run Code Online (Sandbox Code Playgroud)

第一次尝试Array<any Stuff>显示any可以与协议一起使用来指定通用约束。

第二次尝试失败,因为 swift 无法检查 Hashable 一致性。我知道它Stuff符合Hashable,它只是继承自。但是你如何告诉编译器any Stuff将遵循这一点呢?