我正在使用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)
}
}
导致无限循环。为什么会这样?
答案 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执行此操作,但这可能是不必要的。