我正在尝试实现具有符合Hashable协议的通用类型的结构。任何人都可以帮助我理解为什么我会在以下代码中遇到"细分故障:11"错误。
我真的很感谢对此的任何见解。
struct Pmf<Element: Hashable> {
typealias Distribution = [Element : Float]
fileprivate var normalized = false
fileprivate var distribution:[Element : Float] = [ : ] {
didSet {
self.normalized = false
}
}
}
extension Pmf {
init(values: [Element], withProbs probs: [Float]) {
for pair in zip(values, probs) {
self.distribution[pair.0] = pair.1
}
}
var probDist: Distribution {
mutating get {
if !normalized {
self.normalize()
}
return self.distribution
}
}
subscript(value: Element) -> Float? {
mutating get {
if !normalized {
self.normalize()
}
return self.distribution[value]
}
set(prob) {
self.distribution[value] = prob
}
}
mutating func normalize() {
for (key, val) in self.distribution {
self.distribution[key] = val / Float(self.distribution.count)
}
}
}
var pp = Pmf<String>()
pp["One"] = 4
pp["Two"] = 5
pp["three"] = 5
print(pp)
似乎您需要一个小技巧来定义扩展中的值类型的初始化器:
在您的init(values:withProbs:)
上添加一行,如下所示:
init(values: [Element], withProbs probs: [Float]) {
self.init() //<-
for pair in zip(values, probs) {
self.distribution[pair.0] = pair.1
}
}
无论如何,编译器不应用segfault 11崩溃。即使源代码中有一些故障。
您最好将错误报告发送给Apple或Swift.org。
我开始为类似情况编写错误报告(使用具有关联类型的通用类型添加方法减速),并在我尝试过的所有可能的组合中都会获得分割故障。
我开始在操场上写一个"最低可验证的示例",发现我无法复制故障。
应用程序和游乐场之间的唯一区别是应用程序在不同源文件中具有协议和方法。
我合并了两个源文件,不再有细分故障!!
这花了几个小时才能追踪,希望它对其他人有帮助。
更新:提交了此故障的错误,如果您也遇到此错误,请添加评论,让团队知道您已经遇到了它:https://bugs.swift。org/browse/sr-3595