我想做這樣的事情:
enum TestEnum {
case all
case some(_ testElements: Set<TestElement>)
}
public protocol TestElement: Hashable {
var identifier: String { get }
}
但我收到此錯誤:
協議“TestElement”作為一種型別不能符合“Hashable”
我能做什么?感謝您的幫助
uj5u.com熱心網友回復:
我不確定您想將 TestEnum 用于什么目的,但我建議使用一個額外的元素來重寫它,該元素將是 TestClass 的實體,因此您可以符合 TestEnum.some 。這是代碼:
enum TestEnum {
case all
case some(_ testElements: Set<TestClass>)
}
public protocol TestElement: Hashable {
var identifier: String { get }
}
struct TestClass: TestElement {
var identifier: String
//needed to conform to Equatable
static func == (lhs: TestClass, rhs: TestClass) -> Bool {
return true
}
}
還有一個更簡單、更優雅的解決方案,它使用 TestElement 作為結構,而不是協議。我個人會推薦這種方法。這是代碼:
enum TestEnum {
case all
case some(_ testElements: Set<TestElement>)
}
public struct TestElement: Hashable {
public private (set) var identifier: String
}
uj5u.com熱心網友回復:
就像提到的那樣:兩個具體型別不能在同一個集合中(如果將集合定義為協議,則允許),因為尚不清楚如何比較它們。因此,在使用該集合時,您必須在該集合中有一個具體的單一型別。
所以你可以這樣做:
enum TestEnum<T: TestElement> {
case all
case some(_ testElements: Set<T>)
}
public protocol TestElement: Hashable {
var identifier: String { get }
}
也就是說:您的協議保持原樣,并且定義列舉您不需要任何具體型別。您還可以像您打算的那樣限制 中的元素Set以符合TestElement協議。但是當您將要使用列舉時,您必須決定集合將使用的實際型別。
例如,如果你有class Person: TestElement {...,你可以像這樣使用列舉:
let persons = Set<Person>()
TestEnum<Person>.some(persons)
在這里看到一篇關于它的好文章
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349776.html
