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

流体声波

我已经习惯了不断崩溃的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 {}
oisdk

是的,解决编译器崩溃非常困难。但是,有两种技术很有用。首先,如果您对此进行编译并且出现了段错误(目前正在为我做这件事),您仍然可以进入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推断,count并且isEmpty可以基于计算startIndexendIndex(它会同样有效,因为如果你写你自己的方法),以及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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

像Babel这样的编译器如何在固有地不受支持的情况下实现尾部调用优化?

如何在没有C ++编译器聪明的情况下实现GLSL vec *构造语法?

编译器如何在不知道编译时大小的情况下分配内存?

如何在不使浏览器崩溃的情况下显示未知长度的嵌套数组?

编译器如何在不更改参数列表的情况下重载模板函数?

如何在不得到编译器警告的情况下初始化char * args []

如何在没有 webpack fable-loader 的情况下使用 Fable 编译器?

如何在不参考doc的情况下获得g ++编译器的c ++的默认模式?

如何在没有主机编译器的情况下创建Cuda模块

如何在不以“监视”模式运行TypeScript编译器的情况下快速启动Deno?

如何在编译器选项设置为strict的情况下读取元素?

如何在没有编译器的情况下获得简单的Makefile教程

如何在编译器不知道的情况下更改变量的值?

在不使用阵列控制器的情况下如何在Ember模型中实现排序?

如何在不使用DefaultServeMux的情况下实现HandlerFunc

为什么在这种情况下编译器不使用Numeric.plus?

如何在不引起重新编译的情况下更改sbt项目的编译器标志?

F#TaskBuilder:如何在不返回伪值以符合编译器约束的情况下引发异常?

如何在不配置新工具链的情况下告诉Bazel使用哪个编译器

TypeScript:如何在编译器不了解可达性的情况下抛出错误?

如何在没有编译器警告的情况下返回对空字符串的const引用?

如何在不编辑文件的情况下仅在生成的代码中禁用编译器警告

C优化编译器(GCC)是否能够在不使用'const'的情况下检测只读访问的不变值?

如何覆盖默认情况下setup.py使用的编译器(gcc)标志?

如何覆盖默认情况下setup.py使用的编译器(gcc)标志?

默认情况下如何使编译器假定为空

如何避免“需要非空的情况下使用空参数”编译器警告

C ++ / g ++:在这种情况下,编译器如何处理内存分配?

如何在不使Linux内核崩溃的情况下访问mmaped / dev / mem?