J'ai la classe suivante:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
La compilation échoue avec le message:
Le membre d'instance "categoriesPerPage" ne peut pas être utilisé sur le type "ReportView"
Qu'est-ce que ça veut dire?
numPages
plutôt qu'une fermeture, supprimez le signe égal:var numPages: Int { return categoriesPerPage.count }
categoriesPerPage
est définie commevar
au lieu delet
.Réponses:
Vous avez juste une erreur de syntaxe en disant
= {return self.someValue}
. Le=
n'est pas nécessaire.Utilisation :
si tu veux obtenir seulement tu peux écrire
avec la première façon, vous pouvez également ajouter des observateurs comme
set
willSet
&didSet
permettant de l'utiliser
= operator
comme setterla source
categoriesPerPage
, qui est un tableau à 2 dimensions avecv
lequel est Int?set
exemple, bien sûr que vous ne pouvez pas attribuerint
à[int]
Pour toute autre personne qui trébuche là-dessus, assurez-vous de ne pas essayer de modifier la classe plutôt que l'instance! (sauf si vous avez déclaré la variable comme statique)
par exemple.
la source
static
variable etinstance
variable,MyClass.variable
est valide si vous la déclarez comme variable statique (partagée entre toutes les instances)Cela signifie que vous avez une variable d'instance (la variable n'est visible / accessible que lorsque vous avez une instance de cette classe) et que vous essayez de l'utiliser dans le contexte d'une portée statique (méthode de classe).
Vous pouvez faire de votre variable d'instance une variable de classe en ajoutant un attribut static / class.
Vous instanciez une instance de votre classe et appelez la méthode d'instance sur cette variable.
la source
Un autre exemple est que vous avez une classe comme:
vous obtiendrez également le même type d'erreur comme:
C'est parce que vous attribuez à votre méthode le mot-clé "class" (qui fait de votre méthode une méthode de type) et en utilisant comme:
mais qui a défini la variable playSong avant? D'accord. Vous ne devez pas utiliser de mot-clé de classe dans ce cas:
Vous êtes maintenant libre de partir.
la source
Parfois, Xcode lorsque les méthodes de remplacement s'ajoutent
class func
au lieu de simplementfunc
. Ensuite, dans la méthode statique, vous ne pouvez pas voir les propriétés de l'instance. Il est très facile de l'ignorer. C'était mon cas.la source
Votre problème initial était:
les articles précédents le soulignent correctement, si vous voulez une propriété calculée , le
=
signe est errant.Possibilité supplémentaire d'erreur:
Si votre intention était de «définir une valeur de propriété par défaut avec une fermeture ou une fonction» , vous n'avez qu'à la modifier légèrement également. (Remarque: cet exemple n'était évidemment pas destiné à faire cela)
Au lieu de supprimer le
=
, nous ajoutons()
pour désigner une fermeture d'initialisation par défaut. (Cela peut être utile lors de l'initialisation du code de l'interface utilisateur, pour tout conserver au même endroit.)Cependant, la même erreur se produit exactement :
Le problème est d'essayer d'initialiser une propriété avec la valeur d'une autre. Une solution consiste à créer l'initialiseur
lazy
. Il ne sera pas exécuté tant que la valeur n'aura pas été accédée.maintenant le compilateur est content!
la source
J'ai continué à obtenir la même erreur malgré la création de la variable
static
. Solution: Clean Build, Nettoyer les données dérivées, Redémarrez Xcode. Ou raccourci Cmd + Maj + Alt + Kla source
Juste au cas où quelqu'un aurait vraiment besoin d'une telle fermeture , cela peut être fait de la manière suivante:
la source