我已经习惯了不断崩溃的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() }
}
}
因此,现在我们可以逐一添加您的多余内容,直到崩溃。因为它发生的typealias
,count
,generate()
,和isEmpty
,实际上是更好被排除在外。该typealias
推断,count
并且isEmpty
可以基于计算startIndex
和endIndex
(它会同样有效,因为如果你写你自己的方法),以及generate()
方法可以返回IndexingGenerator
该集合本身,而不是数组。
因此,唯一要添加的是远程下标:
extension TestCollection {
subscript(range: Range<Int>) -> ArraySlice<Test> {
fatalError()
}
}
仔细观察一下,您可能会写得有些不同:
extension TestCollection {
subscript(range: Range<Int>) -> ArraySlice<Test> {
get { fatalError() }
set { fatalError() }
}
}
而且没有错误!
只是一个小提示:您似乎Array
为自己的Test
结构实现了一个非常轻量级的包装器。由于所涉及的正确遵循所需的所有协议的复杂性,你可能会更好只是扩展Array
提供的功能,你需要,或延长MutableCollectionType
这样的:
extension MutableCollectionType where Generator.Element == Test {...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句