我有一个这样的班级:
class SomeRequest: Hashable {
let parameter: String
init(parameter: String) {
self.parameter = parameter
}
var hashValue: Int {
return parameter.hashValue
}
}
比起尝试通过键(其中键为SomeRequest)将值设置为Dictionary的方法:
let request = SomeRequest(parameter: "Some")
let dictionary: [SomeRequest: Any] = [:]
dictionary[request] = ...
所有这些之后,我得到以下错误:“ 对类使用未实现的初始化程序'init()'”
可能是什么问题?
答案 0 :(得分:2)
Swift 4.2已更改协议可哈希。您可以看到新的功能:
public func hash(into hasher: inout Hasher)
崩溃的原因是,hash(into:)调用SomeRequest.init()。 您可以说:嘿,我不采用hash(into:)方法!但是swift确实在幕后。
对于需要实现hash(into :)的修复程序:
class SomeRequest: Hashable {
let parameter: String
init(parameter: String) {
self.parameter = parameter
}
func hash(into hasher: inout Hasher) {
hasher.combine(self.parameter)
}
}
现在,您可以删除 vashValue 。它是由hash(into :)自动计算的。
答案 1 :(得分:2)
您可以在此处详细了解Hashable的新增功能: https://www.hackingwithswift.com/articles/115/swift-4-2-improves-hashable-with-a-new-hasher-struct