在可执行的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语句处.

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

推荐答案

Update

多亏@MartinR的 comments ,一个更好的解决方案是实现appendRangeReplaceableCollection协议instead中的replaceSubrange(_:with:)

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

Old solution

您还需要实现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
}

Swift相关问答推荐

编写Swift字符串的属性包装时遇到问题

从`compactMap()`闭包返回`nil`未通过结果类型判断

暂停我的 AR 会话并清除变量和锚点的功能

自定义碰撞形状出现在错误的位置

使用 swift 的 Firebase 身份验证

ConfirmationDialog取消swiftui中的错误

SwiftUI 从任务中安全更新状态变量

如何从另一个 swift 文件中调用函数

从 Finder 打开文件时,SwiftUI 的应用程序(_ openFile:) 从未调用过

用于 Swift 编码的 iOS 应用程序的 Ffmpeg

为什么 Swift Tuples 只能在元素个数小于等于 6 的情况下进行比较?

找不到目标AAA的 SPM 工件 - 仅限 Xcode 13.3

Swift 自定义字体 Xcode

由于编译器中的内部保护级别,无法访问框架 init 中的公共 struct

如何以编程方式读取 wkwebview 的控制台日志(log)

如何在 SwiftUI 中以编程方式滚动列表?

如何交换快速数组中的元素?

Swift 的 JSONDecoder 在 JSON 字符串中有多种日期格式?

Swift - 要求实现协议的类是某个类的子类

快速从文档目录中获取图像