我正在尝试实现符合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)发布于 2016-12-23 02:40:48
似乎您需要一个小技巧来为扩展名中的值类型定义一个初始化器:
向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报告,或者寄给swift.org。
发布于 2017-01-07 15:42:44
我开始为类似的情况编写错误报告(使用带有关联类型的泛型添加方法减速),并且每次尝试的组合都会得到分段错误。
我开始在操场上写一个“最小可验证的例子”,发现我无法复制这个错误。
app和操场之间唯一的区别是app在不同的源文件中有协议和方法。
我合并了两个源文件,不再有分段错误!!!
这花了我几个小时的时间来追踪,希望它能帮助到其他人。
更新:为这个错误提交了一个错误,如果您也遇到了这个错误,请添加一个注释,让团队知道您遇到了它:https://bugs.swift.org/browse/SR-3595
https://stackoverflow.com/questions/41293771
复制相似问题