【问题标题】:Extending Lists in Swift在 Swift 中扩展列表
【发布时间】:2015-04-25 17:10:23
【问题描述】:

我正在使用 Apple 的 Swift 开发系统的后端部分,该部分需要处理电子邮件列表(电子邮件对象数组),我需要将我自己的属性设置为此列表,例如 allowRepeated: Bool,以及一些方法,例如如果allowRepeated 属性设置为true,则performCleanup() 删除重复条目。

我在操场上做了类似的事情,试图遵循关于扩展 NSMutableArray 类的文档说明:

class EmailList: NSMutableArray {
    override var count: Int {
        get {
            // It seems that the line below generates a infinity loop
            return NSArray(array: self).count
        }
    }

    override func insertObject(anObject: AnyObject, atIndex index: Int) {
        insertObject(anObject, atIndex: index)
    }

    override func removeObjectAtIndex(index: Int) {
        super.removeObjectAtIndex(index)
    }

    override func addObject(anObject: AnyObject) {
        super.addObject(anObject)
    }

    override func removeLastObject() {
        super.removeLastObject()
    }

    override func replaceObjectAtIndex(index: Int, withObject anObject: AnyObject) {
        super.replaceObjectAtIndex(index, withObject: anObject)
    }

    override func objectAtIndex(index: Int) -> AnyObject {
        return super.objectAtIndex(index)
    }
}

return NSArray(array: self).count 这行似乎导致了无限循环。为什么会这样?

【问题讨论】:

    标签: ios swift cocoa cocoa-touch


    【解决方案1】:

    Cocoa 集合类(例如 NSMutableArray)是所谓的“类集群”,并且 意味着子类化。我保证任何故障都是由于继承了 NSMutableArray。

    在你的情况下,我猜当你奇怪的 count 覆盖试图创建一个具有自己内容的数组时,当调用 Array(array:) 构造函数时,它再次被要求提供它的 count,因为 Array(array:)大概需要知道它将基于传递的源数组多长时间。起泡,冲洗,重复。

    真正的问题是你为什么要以这种方式短路一个基本的 Cocoa 类?当NSMutableArray.count 工作得很好时,你觉得通过创建一个全新的数组可以获得什么可能的收益? 不要这样做。

    【讨论】:

    • 我知道这个短路。也许并没有明确表示我不太了解 Cocoa 的工作原理。指南是否告诉我从哪里开始?
    • 我收集到你知道它,因为它是你的代码。 ;-) Apple 的文档中有几个入门指南,但相关位在页面顶部附近的 NSArray / NSMutableArray API 参考中(“子类化说明”)。另请参阅文档搜索“类集群”以更好地理解这个概念(这是一个非常广泛的主题)。不过,我对您的代码的看法是,您正在创建一个新数组(本质上是复制可变数组)只是为了计算它。为什么?
    • 因为这是我发现计算元素的唯一 [错误] 方法 :( 我编写了这段代码,是的,但我对 Apple 框架开发的了解很蹩脚。我有一些困难了解它,因为我找不到指导方针和起点。
    • 为什么要覆盖 count() 呢?以及您覆盖但不需要自定义的任何其他内容。
    • 最好听从 Richard 的建议,而不是继承 NSMutableArray 来进行清理。创建您自己的在内部使用数组并执行清理的类。或者只是让一些控制器执行清理。
    【解决方案2】:

    确实,NS(Mutable)Array 并不意味着被子类化,而在 Swift 中这样做是灾难的根源。 我建议您编写自己的数组类,它使用 Swift Array 作为其底层类型 - 基本上是一个包装器,或者您只编写将数组作为参数的外部函数。您也可以使用 NSMutableArray 来执行此操作,但这可能是不必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多