Swift 4.2 error: use of unimplemented initializer 'init()' for class

Swift 4.2 error: use of unimplemented initializer 'init()' for class

我有一个 class 这样的:

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()' 用于 class

可能是什么问题?

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

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:) 自动计算的。

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