swift - Swift 中的段错误

标签 swift macos

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

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 的评论,事实证明,更好的解决方案是从 RangeReplaceableCollection 协议(protocol)实现 replaceSubrange(_:with:) 追加

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)
}

此函数有一个默认实现,但它当然不知道您的内部数据源枚举,因此它不可用。


今后您可能还需要实现具有默认实现的其他函数。

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

public var startIndex: Int {
    return enums.startIndex
}

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

关于swift - Swift 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71548275/

相关文章:

ios - Google Maps 为点击和未选择状态绘制不同的标记图像

ios - 数组中的值不更新

swift - 你能在 swift 中强制使用类型别名吗

swift - 摆脱 Playground 上的额外输出

ios - 是否可以使用 Xcode 使游戏 Controller 振动?

ios - 如何将在 Collection View 中选择的所有单元格列出到另一个 View 中

macos - 适用于 Mac 的命令行 SVN 客户端

macos - 是否有一组一致且漂亮的文档图标(例如 HTML、ZIP、PDF)?

python - 从命令行调用 MAC/Linux 上的 python 脚本 - 传递参数

linux - GCC 4.8.0 构建大小在 OS X 和 Ubuntu 上差异很大