Recibo el siguiente error cuando ejecuto una ejecución swift run dentro de un paquete Swift ejecutable:
zsh: segmentation fault swift runHe podido reducir el código a lo siguiente:
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) La falla de segmentación ocurre en la última línea, en la declaración de append .
¿Puede alguien ayudarme a entender por qué sucede esto y cómo debo solucionarlo?
Actualizar
Gracias a un comentario de @MartinR, resulta que una solución aún mejor es implementar replaceSubrange(_:with:) del protocolo RangeReplaceableCollection en lugar de append
mutating func replaceSubrange<C>(_ subrange: Range<Int>, with newElements: C) where C : Collection, MyEnum == C.Element { self.enums.replaceSubrange(subrange, with: newElements) }Solución antigua
Necesitas implementar append() también
public mutating func append(_ newElement: MyEnum) { enums.append(newElement) } Hay una implementación predeterminada de esta función pero, por supuesto, no tiene conocimiento sobre las enums de fuentes de datos internas, por lo que no se puede utilizar.
En el futuro, es posible que también deba implementar otras funciones que tengan una implementación predeterminada.
Otra cosa, personalmente, también usaría las propiedades de la clase Array al cumplir con el protocolo.
public var startIndex: Int { return enums.startIndex } public var endIndex: Int { return self.enums.endIndex }