2 votes

Pourquoi l'optimisation de l'ensemble du module ne peut-elle pas inférer la finale sur les classes/méthodes publiques non surchargées du module dans le même module ?

Desde cet article Je cite la phrase suivante :

Utiliser l'optimisation de tout le module pour déduire la finale sur les déclarations internes. Les déclarations avec accès interne (le défaut si rien n'est déclaré) ne sont visibles que dans le module où elles sont déclarées. Parce que Swift compile normalement les fichiers qui composent un module séparément, le compilateur ne peut pas savoir si une déclaration interne est remplacée dans un autre fichier. Toutefois, si l'option Whole Module est activée, l'ensemble du module est compilé ensemble au niveau de l'étape de compilation. même temps. Ceci permet au compilateur de faire des inférences sur le module dans son ensemble et de déduire la finalité des déclarations avec des contrôles internes. s'il n'y a pas de surcharges visibles. Revenons à l'extrait de code original, en ajoutant cette fois quelques mots-clés publics supplémentaires à ParticleModel.

public class ParticleModel {
    var point = ( x: 0.0, y: 0.0 )
    var velocity = 100.0

    func updatePoint(newPoint: (Double, Double), newVelocity: Double) {
        point = newPoint
        velocity = newVelocity
    }

    public func update(newP: (Double, Double), newV: Double) {
        updatePoint(newP, newVelocity: newV)
    }
}

var p = ParticleModel()
for i in stride(from: 0.0, through: times, by: 1.0) {
    p.update((i * sin(i), i), newV:i*1000)
}

Lors de la compilation de cet extrait avec Whole Module Optimization, l'option compilateur peut inférer la finale sur les propriétés point, vélocité, et l'appel de la méthode appel de la méthode updatePoint(). En revanche, on ne peut pas en déduire que update() est final puisque update() a un accès public .

Pourquoi l'OMM ne peut-elle pas envoyer un appel statique à update() si ParticalModel n'est pas surchargé dans le module actuel ? Il n'est pas permis de remplacer ParicleModel dans d'autres modules (puisque son modificateur d'accès est public pas open ). Je m'attendrais à ce que chaque méthode et propriété de la classe puisse avoir final déduit parce qu'il n'est pas surchargé dans le module actuel, mais la documentation mentionne explicitement qu'il ne peut pas déduire les éléments suivants final .

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