在我Swift 4.2.1的代码中,我有这个枚举:
enum MyEnum {
case caseOne(Int)
case caseTwo(String)
case caseThree
}
它符合Equatable
:
extension MyEnum: Equatable {
static func == (lhs: MyEnum, rhs: MyEnum) -> Bool {
switch (lhs, rhs) {
case (.caseOne, .caseOne), (.caseTwo, .caseTwo), (.caseThree, .caseThree):
return true
default:
return false
}
}
}
我需要让它符合Hashable
协议,因此我添加了一个扩展(extension):
extension MyEnum: Hashable {
var hashValue: Int {
switch self {
case .caseOne:
return 1
case .caseTwo:
return 2
case .caseThree:
return 3
}
}
}
现在我想迁移到Xcode 10中可用的新API。我删除了我的hashValue
实现并添加了hash(into:)
实现:
extension MyEnum: Hashable {
func hash(into hasher: inout Hasher) {
switch self {
case .caseOne:
hasher.combine(1)
case .caseTwo:
hasher.combine(2)
case .caseThree:
hasher.combine(3)
}
}
}
请问我是否成功地切换到了新的API?我使用这个测试,如果一切正常,它会打印出true
两次:
var testDictionary = [MyEnum: Int]()
testDictionary[.caseOne(100)] = 100
testDictionary[.caseOne(1000)] = 1000
testDictionary[.caseTwo("100")] = 100
testDictionary[.caseTwo("1000")] = 1000
let countCaseOne = testDictionary.reduce(0) {
if case .caseOne = $1.key {
return $0 + 1
}
return $0
} == 1
print(countCaseOne) // true
let countCaseTwo = testDictionary.reduce(0) {
if case .caseTwo = $1.key {
return $0 + 1
}
return $0
} == 1
print(countCaseTwo) // true
hasher.combine(self.property)
的内容在hash(into:)
的实现中。但是我没有找到枚举的例子。这就是为什么我想知道我的实现是否正确的原因。 - Roman Podymov