2017-01-14 1 views
7

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?

Répondre

5

Ceci est un problème connu dans le compilateur Swift. Le problème est qu'une fois que vous utilisez des fermetures ou des propriétés paresseuses comme celle-ci, chaque fichier Swift sera vérifié par type. J'ai écrit un article de blog sur ce sujet que vous pouvez trouver here.

+0

Je souhaite avoir lu votre message plus tôt ... – iWheelBuy