Generic Swift结构:分段错误:11

时间:2016-12-23 00:51:36

标签: ios iphone swift segmentation-fault swift3

我正在尝试使用符合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)

2 个答案:

答案 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 Appleswift.org

答案 1 :(得分:1)

我开始为类似的情况编写一个错误报告(使用带有相关类型的泛型添加方法减速),并且在我尝试的每个可能组合中都会出现分段错误。

我开始写一个&#39;最小可验证示例&#39;在操场上发现我无法复制错误。

app和playground之间的唯一区别是app在不同的源文件中有协议和方法。

我合并了两个源文件,没有更多的分段错误!!

这需要花费数小时的时间来追踪,希望它可以帮助其他人。

更新:提交了此错误的错误,如果您遇到此错误,请添加评论以让小组了解您已经遇到过错误:{{3} }