Swift 中的分段错误
Segmentation Fault in 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 的评论,事实证明更好的解决方案是从 RangeReplaceableCollection
协议 而不是 实现 replaceSubrange(_:with:)
15=]
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
class 的属性。
public var startIndex: Int {
return enums.startIndex
}
public var endIndex: Int {
return self.enums.endIndex
}
当 运行 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 的评论,事实证明更好的解决方案是从 RangeReplaceableCollection
协议 而不是 实现 replaceSubrange(_:with:)
15=]
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
class 的属性。
public var startIndex: Int {
return enums.startIndex
}
public var endIndex: Int {
return self.enums.endIndex
}