La déclaration value
ci - dessous
import Foundation
class AAA: NSObject {
func test2() {
self.dynamicType
}
}
extension AAA {
static let value = 111
}
provoque l'erreur de compilation suivante
A declaration cannot be both 'final' and 'dynamic'
Pourquoi cela se produit-il et comment puis-je y faire face?
J'utilise Swift 1.2 (la version livrée dans Xcode 6.3.1 6D1002)
swift
compiler-errors
éonil
la source
la source
func test2
déclaration n'est pas nécessaire pour déclencher l'erreur, à partir de Xcode 7.3.1.Réponses:
Ce problème survient parce que Swift essaie de générer un accesseur dynamique pour la propriété statique pour la compatibilité Obj-C, puisque la classe hérite de
NSObject
.Si votre projet est uniquement dans Swift, plutôt que d'utiliser un
var
accesseur, vous pouvez éviter le problème via l'@nonobjc
attribut dans Swift 2.0:la source
AAA
ici), donc je suppose que je suis en clair?NSManagedObject
sous-classe. Cela l'a corrigé!Vous obtiendrez cette erreur si votre classe remplit ces conditions.
NSObject
.static let
champ.dynamicType
.Je ne sais pas pourquoi cela se produit, mais vous pouvez essayer cette solution de contournement.
Ou sous une forme plus courte.
Utilisez à la
static var { get }
place destatic let
.Bien que le getter de propriété et son coût d'appel soient très probablement éliminés par l'optimiseur LLVM dans l'exemple ci-dessus, vous voudrez peut-être l'éviter explicitement.
Si vous êtes préoccupé par ce coût de calcul de valeur, vous pouvez le créer une fois et le mettre en cache comme celui-ci.
Ou comme ça si vous souhaitez masquer complètement l'existence du cache.
la source
private static let _value: Int = 111
static var value: Int { return _value }
il n'a pas leget {
mais le compilateur mentionne quelque chose à propos de la propriété calculée si j'utilise à lavar
place delet
get
dans ce cas implicite. Ce que vous pouvez faire à la place est le résultat de assign la fermeture à la variable de telle sorte que la fermeture est appelée une seule fois:let value: Int = { return 111 }()
. Les crochets à la fin appellent la fermeture. Mais sachez qu'il s'agit à nouveau d'une propriété stockée et donc non disponible dans les extensions.J'ai eu cette erreur aussi.
Mon problème était juste un var statique dans une extension rapide.
Le déplacer vers l'implémentation de classe a résolu le problème pour moi.
la source
Je viens de trébucher sur le même problème avec une cause différente et je voudrais le publier ici pour d'autres personnes rencontrant le même message d'erreur inutile.
Une classe finale qui remplace une variable calculée définie dans une extension provoque également cette erreur. Cela fonctionne pour les fonctions et ressemble donc à un bogue du compilateur.
la source
J'ai résolu ce problème en déplaçant la déclaration statique dans la nouvelle structure que j'ai définie dans l'extension.
Donc au lieu de ça:
J'ai ceci:
la source
Vous pouvez le marquer comme privé pour éviter cette erreur. Si vous souhaitez l'exposer, vous pouvez l'envelopper dans une fonction publique:
Dans mon cas, je n'ai référencé la propriété que dans l'extension elle-même, il n'était donc pas nécessaire de l'exposer.
la source
En guise de légère amélioration par rapport à la réponse de @ Eonil , ce
get
n'est pas nécessaire:la source