我正在尝试使用符合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)
答案 0 :(得分:1)
似乎你需要一个小技巧来为扩展中的值类型定义初始化器:
在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崩溃。即使源代码中有一些错误。
您最好发送Bug Report to Apple或swift.org。
答案 1 :(得分:1)
我开始为类似的情况编写一个错误报告(使用带有相关类型的泛型添加方法减速),并且在我尝试的每个可能组合中都会出现分段错误。
我开始写一个&#39;最小可验证示例&#39;在操场上发现我无法复制错误。
app和playground之间的唯一区别是app在不同的源文件中有协议和方法。
我合并了两个源文件,没有更多的分段错误!!
这需要花费数小时的时间来追踪,希望它可以帮助其他人。
更新:提交了此错误的错误,如果您遇到此错误,请添加评论以让小组了解您已经遇到过错误:{{3} }