Chargement différé des Propriétés en swift
Je suis d'essayer d'envelopper ma tête autour de la Swift de la langue. Un modèle commun lors de la construction de points de vue dans le code Objective-C est de remplacer les propriétés de l'INTERFACE utilisateur et paresseux charger comme suit:
@property(nonatomic, strong) UILabel *myLabel;
- (UILabel *)myLabel
{
if (!_myLabel) {
_myLabel = [[UILabel alloc] initWithFrame:CGRectMake(20.0f, 75.0f, 320.0f, 20.0f)];
[_myLabel setFont:[UIFont subHeadlineFont]];
[_myLabel setTextColor:[UIColor subHeadlineColor]];
[_myLabel setText:@"Hello World"];
}
return _myLabel;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:self.myLabel];
}
Cela permet la configuration de UIElements à être autonome au sein de leur installation, mais qui n'entraîne pas de reconfigurer à chaque fois.
Il semble que nous n'avons pas accès à la mémoire de sauvegarde rapide et la @lazy
mot-clé n'a pas vraiment la même sémantique.
Je suis curieux de savoir si quelqu'un a identifié une tendance similaire dans Swift qui permet de maintenir la configuration de variables et constantes avec leur déclaration dans un pur syntaxiques de façon à ne pas entraîner la reconfiguration de tous les temps?
Vous devez vous connecter pour publier un commentaire.
Je pense que
lazy
bien initialisé avec une fermeture de travail:Que j'ai lu “La Swift Langage de Programmation.” (Damier exemple), la fermeture n'est évaluée qu'une seule fois).
var
et ne peut pas êtrelet
Le message du journal "d'en faire un nouveau Truc" apparaît une seule fois, prouvant qu'un seul Truc a été créée - la fermeture a été appelé qu'une seule fois, à savoir pour initialiser cette propriété. C'est effectivement ce que vous décrivez. Tout ce que vous avez à faire est d'ajouter plus de la fermeture afin de configurer l'objet retourné.
Si vous faites le var
@lazy
et commentez laprintln
états, pas Thingy est créé, qui prouve que la paresse est ce qu'il est destiné à faire; vous pourriez omettre ceci, cependant, puisque vous savez que l'étiquette sera en effet toujours être nécessaire dès le début. Le point de@lazy
est pour empêcher la fermeture de jamais appelés à moins que le getter est appelé, mais vous allez toujours à l'appel de la lecture donc, qui est inutile dans votre situation._myButton.addTarget(self, action: "buttonPressed", forControlEvents:.TouchUpInside)
ne serait-ce pas la capture de soi dans le contexte de la fermeture?@lazy
préfixe parce que je ne pense pas queself
reste équivalent une fois que je suis à l'intérieur de la clôture. Je vais continuer à essayer de travailler sur les erreurs de syntaxe et de la mise à jour de l'original, quand j'ai pensé à elle. Merci à tout le monde!@lazy
nous est initialisation (nous sommes dans le milieu). Ainsi, en dépit de ce que j'ai dit dans ma réponse, vous devrez garder@lazy
- qui ne fait pas de mal en tout cas. Très intéressant!!! Et cette façon de faire est en fait plus proche de votre original.@lazy
mot-clé. Dans ce cas, je pense que j'ai besoin d'attribuer la coche verte pour le premier mec à répondre avec la bonne réponse, mais de gros coup de coeur pour parler à travers elle. Merci @Matt!{}()
définit une fonction anonyme et l'appelle.UIViewController
'sview
aussi, même si c'est toujours nécessaire.@lazy
attribut var (maintenant renommélazy
) dans ce cas particulier, afin de mettre en œuvre le modèle. Toutefois, cela pourrait être juste une coïncidence;lazy
est nécessaire dans ce modèle, si la variable de l'initialiseur ne fait référence àself
, ce qui arrive beaucoup. Voir ma discussion ici: apeth.com/swiftBook/ch03.html#_lazy_initialization.C'est à peu près la Swift version de votre ObjectiveC exemple. (simplifié à l'utilisation d'un
Int
plutôt que de vue)Si ce n'est pas très jolie.
lazy
Apple semble être en train de faire autrement... Si je créer un nouveau projet dans Xcode et ajouter des Données de Base, il y a un exemple dans le
AppDelegate.swift
:Cependant, ce lit pour moi que la variable est créée lors de l'initialisation, toutefois viens de lire par la suite et
@lazy
semble être une meilleure mise en œuvre. Toutes les pensées?J'ai donc essayé ceci:
Et les deux sont en effet tout simplement créé paresseusement. Comme @bradlarson points sur Twitter:
lazy
.Comme une variante de Christian Otkjær de répondre, il est également possible d'affecter à une méthode d'une classe à l' @lazy var:
C'est effectivement la même que l'aide d'une fermeture, mais dans le cas où il y a trop de lignes de code dans la fermeture, il y a une option pour mettre ce code dans une méthode de classe quelque part d'autre après la déclaration de toutes les propriétés et méthodes d'initialisation.
Vous pouvez fournir une fermeture sur votre @lazy variable à déclarer de la façon dont il devrait être créée:
label
est unfunc
, je pense que vous avez besoin pour retirer le() ->
Swift 3.0
Je préfère ce style en ligne.