Ce source a un paragraphe Définition d'une propriété par défaut Valeur à une fermeture ou la fonction où l'on peut trouver un exemplevaleur de la propriété par défaut avec fermeture fait un compilateur de recompiler tous les fichiers
Voici un aperçu du squelette de la façon dont une fermeture peut être utilisée pour fournir une valeur de propriété par défaut:
class SomeClass { let someProperty: SomeType = { // create a default value for someProperty inside this closure // someValue must be of the same type as SomeType return someValue }() }
Eh bien, je l'utilise très souvent ... aussi, j'attends souvent pour l'ensemble du projet à recompil e après avoir changé un seul symbole. Et aujourd'hui j'ai découvert que ces deux choses sont associées les unes aux autres.
laisse imaginer que nous avons une classe où nous avons mis en propriétés par défaut avec une fermeture et une fonction
class Class1 {
let value: Int
init(_ value: Int) {
self.value = value
}
private lazy var lazyValueWithClosure: Int = {
return 1111
}()
private lazy var lazyValueWithFunction: Int = self.getValue()
private func getValue() -> Int {
return 2222
}
}
Nous avons aussi une autre classe dans un fichier séparé où nous utilisons ce qui précède Class1
class Class2 {
let value: Int
init(_ value: Int) {
self.value = value
_ = Class1(100)
}
}
Et une autre classe dans un fichier séparé où nous utilisons Class2
class Class3 {
let value: Int
init(_ value: Int) {
self.value = value
_ = Class2(100)
}
}
et etc ...
J'ai décidé d'utiliser terminal
+ xcodebuild
+ grep
pour obtenir uniquement les informations sur les fichiers recompilés. C'est la commande que j'utilise pour obtenir les informations de compilation:
xcodebuild -scheme Test -sdk iphonesimulator -arch x86_64 -configuration Debug build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep '^[0-9]\{1,20\}.[0-9]\{1,20\}ms.*init(_ value: Int)'
C'est tout pour les préparations. Maintenant, nous allons à Class1
et changeons 2222
à une autre valeur. Exécutez la commande ci-dessus et obtenez un résultat.
0.1ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class1.swift:11:5 init(_ value: Int)
Le résultat est bon. La définition de la valeur par défaut avec les fonctions fonctionne comme prévu. Nous avons changé un fichier et un seul fichier a été compilé.
Ensuite, changeons la valeur 1111
du Class1
en une autre valeur et exécutez la commande. Borne de sortie ressemble maintenant à ceci:
0.8ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class5.swift:11:5 init(_ value: Int)
0.3ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class1.swift:11:5 init(_ value: Int)
1.0ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class4.swift:11:5 init(_ value: Int)
0.3ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class3.swift:11:5 init(_ value: Int)
0.3ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class2.swift:11:5 init(_ value: Int)
Toutes les classes ont été recompilés ... Maintenant, imaginez que vous avez un grand projet et tout petit changement dans une fermeture de valeur par défaut vous fait attendre pour l'ensemble du projet à recompiler.
Questions:
- Quelle est la raison?
- Des suggestions sur l'utilisation des fermetures de valeurs par défaut et de ne pas subir de recompilation?
- En relation avec this topic?
Je souhaite avoir lu votre message plus tôt ... – iWheelBuy