Swift 中的分段错误

乔米

swift run在可执行 Swift 包中运行时出现以下错误:

zsh: segmentation fault  swift run

我已经能够将代码归结为以下内容:

enum MyEnum {
    case FirstCase
    case SecondCase
    case Other
}

struct MyEnumCollection {
    private var enums: [MyEnum]
}

extension MyEnumCollection: RangeReplaceableCollection {
    public init() {
        self.enums = []
    }
}

extension MyEnumCollection: Collection {
    public var startIndex: Int {
        0
    }

    public var endIndex: Int {
        self.enums.count
    }

    public subscript(position: Int) -> MyEnum {
        return self.enums[position]
    }

    public func index(after i: Int) -> Int {
        return self.enums.index(after: i)
    }
}

var collection = MyEnumCollection()

collection.append(MyEnum.FirstCase)

分段错误发生在append语句的最后一行。

有人可以帮我理解为什么会发生这种情况以及我应该如何解决这个问题?

乔金丹尼尔森

更新

感谢@MartinR 的评论,事实证明,更好的解决方案是replaceSubrange(_:with:)RangeReplaceableCollection协议不是append

mutating func replaceSubrange<C>(_ subrange: Range<Int>, with newElements: C) where C : Collection, MyEnum == C.Element {
    self.enums.replaceSubrange(subrange, with: newElements)
}

旧解决方案

append()您还需要实施

public mutating func append(_ newElement: MyEnum) {
    enums.append(newElement)
}

这个函数有一个默认实现,但它当然不知道你的内部数据源enums,所以它不可用。


展望未来,您可能还需要实现具有默认实现的其他功能。

Array另一件事,我个人在遵守协议时也会使用类的属性。

public var startIndex: Int {
    return enums.startIndex
}

public var endIndex: Int {
    return self.enums.endIndex
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章