Membre de l'Instance ne peut pas être utilisé sur le type de
J'ai la classe suivante:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
Compilation échoue avec le message:
Membre de l'Instance 'categoriesPerPage' ne peut pas être utilisé sur le type de
'ReportView'
Qu'est-ce que cela signifie?
- Deviner que vous allez déclarer une propriété calculée
numPages
plutôt que d'une fermeture à supprimer le signe égal:var numPages: Int { return categoriesPerPage.count }
- Pouvez s'il vous plaît être expliqué de façon plus approfondie exactement ce que ce message d'erreur signifie? Je suis de le voir dans un contexte totalement différent.
- Lorsque vous déclarez un bloc dans le domaine de la classe, comme ci-dessus, vous êtes limité à ce qui est disponible dans le type. Vous n'avez pas accès à tout les membres de l'instance.
- Remarque: Le message d'erreur est similaire à celui que vous obtenez lorsque vous essayez de créer un paresseux variable, mais vous avez oublié une des exigences. Dans votre cas, vous ne voulez pas un paresseux variable depuis
categoriesPerPage
est défini commevar
au lieu delet
. - Supprimer = à partir de: var nbpages: Int =
- J'ai atterri ici, à l'aide d'une struct. J'ai été absent
static let
Vous devez vous connecter pour publier un commentaire.
Vous avez juste erreur de syntaxe en disant
= {return self.someValue}
. Le=
n'est pas nécessaire.Utilisation :
si vous voulez obtenir seulement vous pouvez écrire
avec la première méthode, vous pouvez également ajouter des observateurs, comme
set
willSet
&didSet
permettant d'utiliser
= operator
comme un settercategoriesPerPage
, qui est le 2-dim tableau avecv
qui est de type Int?set
exemple, bien-sûr, vous ne pouvez pas affecter deint
en[int]
Pour quelqu'un d'autre qui trébuche sur, assurez-vous que vous ne tentez pas de modifier la classe plutôt que de l'instance! (sauf si vous avez déclaré la variable statique)
par exemple.
static
variable etinstance
variable,MyClass.variable
est valide que si vous allez déclarer comme variable statique (partagée entre toutes les instances)C'est à dire que vous avez une variable d'instance (la var n'est visible/accessible lorsque vous avez une instance de cette classe) et vous essayez de l'utiliser dans le contexte d'une portée statique (méthode de classe).
Vous pouvez faire votre variable d'instance d'une variable de classe par l'ajout d'attribut static.
Vous pouvez faire de votre méthode de classe une méthode d'instance, par la suppression de l'attribut de classe.
Un autre exemple est, vous avez la classe comme :
vous pourrez également obtenir le même type d'erreur comme :
C'est parce que vous attribuez à votre méthode avec "classe" mot-clé (ce qui rend votre méthode une méthode de type) et en utilisant comme :
mais qui a mis le playingSong variable avant? Ok. Vous ne devriez pas utiliser la classe de mots clés pour ce cas :
Maintenant, vous êtes libre d'aller.
Votre problème initial était:
précédents posts correctement le point de sortir, si vous voulez un propriété calculée, le
=
signe est errant.Possibilité supplémentaire de l'erreur:
Si votre intention était d' "Réglage par Défaut la Valeur de la Propriété avec une Fermeture ou d'une Fonction", vous avez seulement besoin de changer un peu aussi. (Note: cet exemple n'était évidemment pas prévu de le faire)
Au lieu de supprimer les
=
, nous ajoutons()
pour désigner une initialisation par défaut de fermeture. (Cela peut être utile lors de l'initialisation du code de l'INTERFACE utilisateur, de le conserver en un seul endroit.)Cependant, la exactement la même erreur se produit:
Le problème est d'essayer d'initialiser une propriété avec la valeur de l'autre. Une solution est de faire de l'initialiseur de
lazy
. Il ne sera pas exécutée jusqu'à ce que la valeur est accessible.maintenant que le compilateur est heureux!
J'ai continué à obtenir la même erreur, en dépit de la prise de la variable
static
.Solution: Nettoyer Construire, Nettoyage Des Données, Redémarrez Xcode. Ou raccourci
Cmd + Maj+Alt+K
Juste au cas où quelqu'un a vraiment besoin d'une fermeture comme ça, il peut être fait de la manière suivante: