在Swift中扩展列表

时间:2015-04-25 17:10:23

标签: ios swift cocoa cocoa-touch

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

我在操场上做了类似的事情,试图按照扩展NSMutableArray类的文档说明进行操作:

true

似乎行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) } } 导致无限循环。为什么会这样?

2 个答案:

答案 0 :(得分:1)

Cocoa集合类(例如NSMutableArray)就是所谓的“类集群”,并且意味着要进行子类化。我保证任何故障都归因于NSMutableArray的子​​类化。

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

真正的问题是为什么你会以这种方式缩短基本的Cocoa类?当statement = '''n = [] for i in xrange(10): n.append(oct(i))''' Timer(statement).repeat(3) 完全正常工作时,你会通过创建一个全新的数组获得什么样的收获? 不要做这样的事情。

答案 1 :(得分:0)

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