Swift 4:对象可以从集合中删除吗

时间:2018-12-29 03:08:27

标签: swift

以下是我要实现的伪代码:

let a = AClass()
let go = NSMutableArray()
go.add(a)
.
.
.
class AClass{
  .
  .
  .
  fileprivate func removeMyselfFromCollection() { //Called from within the class
    //TODO: How to remove myself from the collection I am in.        
  }
}

可以是任何集合,数组或字典等。类似于removeFromSuperview()

更新:正在回答一个常见问题...

问题:为什么我需要这个?

答案:场景有点复杂,但是将其归结为最基本的细节。我正在将文件(音频,视频,声音)上传到远程存储。文件上传后,我便有了一种机制(侦听器)来知道文件何时存在,而无需本地对象来告诉我状态。我将局部对象添加到全局集合中,以使它们保持活动状态,直到文件上传为止(一个对象代表每个文件)。每个对象负责每个上传的文件。我希望我的每个对象在上传完成后都会从全局集合中静默删除自己(上述原因)。

2 个答案:

答案 0 :(得分:2)

除非您:

a。自己实现此方法。

b。将集合作为参数传递。

c。让对象的方法将remove(self)消息转发到集合。

鉴于您无论如何都必须将消息转发到集合,并且在调用该方法时必须知道该集合,所以这种方法没有任何价值。它增加了复杂性,却没有增加任何价值。

另一个问题是对象可以是多个集合的成员。在这种情况下应该怎么办?是否应该将其从其所属的所有集合中删除?它被添加到的第一个?最后?您将如何跟踪呢?

总而言之,这似乎是一个无痛无益的主张。

答案 1 :(得分:0)

您可以通过在NSMutableArray的扩展名中键入自己的自定义插入方法来执行此操作,并且在此方法中,可以将数组分配给对象变量。

class SomeClass {
    var containedBy: NSMutableArray?
    var value: String

    init(value: String) {
        self.value = value
    }

    func removeFromCollection() -> Void {
        guard let containedBy = self.containedBy else { return }
        containedBy.remove(self)
    }
}


extension NSMutableArray{
    func addRemovable(value: SomeClass)  {
        value.containedBy = self
        self.add(value)
    }
}