1

我有这样的课:

class SomeRequest: Hashable {
    let parameter: String

    init(parameter: String) {
        self.parameter = parameter
    }

    var hashValue: Int {
        return parameter.hashValue
    }
}

比我尝试通过键为字典设置值,其中键是 SomeRequest:

let request = SomeRequest(parameter: "Some")
let dictionary: [SomeRequest: Any] = [:]
dictionary[request] = ...

毕竟我得到这个错误:“使用未实现的初始化程序'init()'用于类

可能是什么问题呢?

4

2 回答 2

2

Swift 4.2 改变了Hashable协议。你可以看到新的功能:

public func hash(into hasher: inout Hasher) 

崩溃的原因是 hash(into: ) 调用 SomeRequest.init()。你可以说:嘿,我不采用 hash(into: ) 方法!但斯威夫特在幕后。

对于您需要实施 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:) 自动计算的。

于 2018-10-04T07:13:56.397 回答
2

详细信息,您可以在此处了解 Hashable 的新功能: https ://www.hackingwithswift.com/articles/115/swift-4-2-improves-hashable-with-a-new-hasher-struct

于 2018-10-04T10:39:13.267 回答