Search code examples
swiftautomatic-ref-countingweak-referencesnspointerarray

How do I declare an array of weak references in Swift?


I'd like to store an array of weak references in Swift. The array itself should not be a weak reference - its elements should be. I think Cocoa NSPointerArray offers a non-typesafe version of this.


Solution

  • Create a generic wrapper as:

    class Weak<T: AnyObject> {
      weak var value : T?
      init (value: T) {
        self.value = value
      }
    }
    

    Add instances of this class to your array.

    class Stuff {}
    var weakly : [Weak<Stuff>] = [Weak(value: Stuff()), Weak(value: Stuff())]
    

    When defining Weak you can use either struct or class.

    Also, to help with reaping array contents, you could do something along the lines of:

    extension Array where Element:Weak<AnyObject> {
      mutating func reap () {
        self = self.filter { nil != $0.value }
      }
    }
    

    The use of AnyObject above should be replaced with T - but I don't think the current Swift language allows an extension defined as such.