202 votes

Comment dois-je déclarer un tableau de références faibles dans Swift?

Je voudrais stocker un tableau de références faibles en Swift. Le tableau lui-même ne devrait pas être une référence faible - ses éléments doivent être. Je pense que l'Objective-C NSPointerArray offre non typesafe version de ce.

170voto

GoZoner Points 15679

Créer un wrapper générique comme:

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

Ajouter des instances de cette classe à votre ensemble.

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

74voto

Thierry Points 26

Vous pouvez utiliser le NSHashTable avec weakObjectsHashTable. (NSHashTable.weakObjectsHashTable())

NSHashTable De Référence De Classe

Disponible dans OS X v10.5 et versions ultérieures.

Disponible sous iOS 6.0 et versions ultérieures.

12voto

rjkaplan Points 357

Ce n'est pas ma solution. Je l'ai trouvé sur les Forums des Développeurs Apple.

@GoZoner a une bonne réponse, mais il se bloque, la Swift compilateur.

Voici une version de la faiblesse de l'-conteneur de l'objet ne tombe pas en panne le courant publié compilateur.

struct WeakContainer<T where T: AnyObject> {
    weak var _value : T?

    init (value: T) {
        _value = value
    }

    func get() -> T? {
        return _value
    }
}

Vous pouvez ensuite créer un tableau de ces conteneurs:

let myArray: Array<WeakContainer<MyClass>> = [myObject1, myObject2]

10voto

Joshua Weinberg Points 22701

Vous pouvez le faire en créant un objet wrapper de tenir une faible pointeur.

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

Et puis, à l'aide de ces dans le tableau

var weakThings = WeakThing<Foo>[]()

9voto

Eonil Points 19404

Comment au sujet de style fonctionnel wrapper?

func linkWeakly <T where T: AnyObject> (target:T) -> ()->T? {
    weak var    value   =   target as T?
    return  {
        return  value
    }
}

Appelez simplement retourné la fermeture de vérifier la cible est toujours en vie.

let linkage = linkWeakly(obj1)
let isAlive = linkage() != nil
let theValue = linkage()!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X