2014-06-06 1 views
2

J'essaie d'utiliser l'attribut @lazy pour charger une propriété à la demande, mais j'ai besoin de transmettre une variable membre dans l'initialiseur de l'instance paresseuse.Propriétés paresseuses avec initialiseurs

Voici l'exemple

class Worker 
{ 
    init(AnyObject context) { ... } 
} 

class Hive 
{ 
    let context : AnyObject 

    init(AnyObject context) 
    { 
    self.context = context 
    } 

    @lazy var worker = Worker(self.context) // This does not work 
} 

est-il pas possible d'injecter des variables membres dans des propriétés chargées paresseux?

Voici ma solution de contournement plutôt ennuyeux:

class Hive 
{ 
    // initializer and context constant elided 

    let lazy = Lazy() 

    class Lazy 
    { 
    var worker : Worker? = nil 
    var token : dispatch_once_t = 0 
    } 

    var worker : Worker 
    { 
    get 
    { 
     dispatch_once(&lazy.token) { self.lazy.worker = Worker(self.context) } 
     return lazy.worker! 
    } 
    } 
} 

S'il vous plaît me dire qu'il ya une meilleure façon d'y parvenir ...

Répondre

3

Le code suivant compile pour moi (votre code tapé doit avez été à l'extérieur de XCode, car la syntaxe est désactivée)

class Worker 
{ 
    init(context : AnyObject) { } 
} 

class Hive 
{ 
    var context : AnyObject 

    init(context : AnyObject) 
    { 
     self.context = context 
    } 

    @lazy var worker : Worker = { 
     let instance = Worker(context: self.context) 
     return instance; 
    }() 
} 

Il fonctionne aussi sans la fermeture:

@lazy var worker : Worker = Worker(context: self.context) 
+0

Merci beaucoup! J'ai modifié mon code de contournement pour être plus précis, mais j'apprécie beaucoup plus votre solution! – Erik

+0

@SiLo Pas de problème! Et oui, le '@ paresseux devrait être la manière recommandée pour ceci:] – Jack

Questions connexes