gpt4 book ai didi

swift - 如何在不使编译器崩溃的情况下实现 MutableCollectionType?

转载 作者:可可西里 更新时间:2023-11-01 01:37:50 24 4
gpt4 key购买 nike

我已经习惯了一个永远崩溃的 Swift 编译器,而且通常有很多可用的解决方法。然而这一次我无法成功地使结构符合 MutableCollectionType

只要您不取消对 MutableCollectionType 一致性的注释,就可以将附加示例粘贴到 Playground 中。
我避免了所有方法的具体实现以缩小崩溃原因的范围(因此所有的 fatalError())。但即使正确实现了这些方法,编译器也会崩溃。

有人知道如何解决此编译器崩溃吗?

struct Test {}


struct TestCollection: CollectionType {

typealias Index = Int


private var values: [Test]


var count: Int {
fatalError()
}


var endIndex: Int {
fatalError()
}


func generate() -> IndexingGenerator<Array<Test>> {
fatalError()
}


var isEmpty: Bool {
fatalError()
}


subscript(bounds: Range<Int>) -> ArraySlice<Test> {
fatalError()
}


subscript(position: Int) -> Test {
get { fatalError() }
mutating set { fatalError() }
}


var startIndex: Int {
fatalError()
}
}


// uncommenting the following line crashes the compiler
// extension TestCollection: MutableCollectionType {}

最佳答案

是的,解决编译器崩溃问题非常困难。不过,有一些技巧很有用。首先,如果您编译它并出现段错误(目前我正在这样做),您仍然可以在 Xcode 中查看错误,它可能会为您提供更多信息。

或者,您可以尝试将崩溃减少到最小工作示例,以查看哪个部分使编译器崩溃。碰巧的是,MutableCollectionType 一致性的最小方法集实际上非常小:

struct Test {}

struct TestCollection: MutableCollectionType {

var startIndex: Int { fatalError() }

var endIndex: Int { fatalError() }

subscript(position: Int) -> Test {
get { fatalError() }
mutating set { fatalError() }
}

}

所以现在我们可以将您的额外内容一一添加回去,直到它崩溃。事实上,typealiascountgenerate()isEmpty 实际上最好保留出去。 typealias被推断,countisEmpty可以根据startIndexendIndex计算出来code>(它会和你自己写方法一样高效),并且 generate() 方法可以在集合本身上返回一个 IndexingGenerator,而不是数组。

所以唯一要加回去的是范围下标:

extension TestCollection {
subscript(range: Range<Int>) -> ArraySlice<Test> {
fatalError()
}
}

仔细观察一下,您可能会写出一些不同的内容:

extension TestCollection {
subscript(range: Range<Int>) -> ArraySlice<Test> {
get { fatalError() }
set { fatalError() }
}
}

没有错误!

请注意:看起来您正在为您的测试 结构在Array 周围实现一个非常轻量级的包装器。由于正确遵循所有必需协议(protocol)的复杂性,您可能最好只是扩展 Array 以提供您需要的功能,或者扩展 MutableCollectionType 像这样:

extension MutableCollectionType where Generator.Element == Test {...

关于swift - 如何在不使编译器崩溃的情况下实现 MutableCollectionType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34043738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com