Le membre d’instance ne peut pas être utilisé sur le type

J’ai le cours suivant:

class ReportView: NSView { var categoriesPerPage = [[Int]]() var numPages: Int = { return categoriesPerPage.count } } 

La compilation échoue avec le message:

Le membre de l’instance ‘categoriesPerPage’ ne peut pas être utilisé sur le type ‘ReportView’

Qu’est-ce que ça veut dire?

Vous avez juste une erreur de syntaxe lorsque vous dites = {return self.someValue}

Utilisation :

 var numPages: Int { get{ return categoriesPerPage.count } } 

si vous voulez obtenir seulement vous pouvez écrire

 var numPages: Int { return categoriesPerPage.count } 

avec la première façon, vous pouvez également append des observateurs comme set willSet & didSet

 var numPages: Int { get{ return categoriesPerPage.count } set(v){ self.categoriesPerPage = v; } } 

permettant d’utiliser = operator tant que setter

 myObject.numPages = 5; 

Pour quiconque trébuche sur cela, assurez-vous de ne pas modifier la classe plutôt que l’instance! (sauf si vous avez déclaré la variable comme statique)

par exemple.

 MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass' instanceOfMyClass.variable = 'Foo' // Right! 

Il dit que vous avez une variable d’instance (la variable est uniquement visible / accessible lorsque vous avez une instance de cette classe) et vous essayez de l’utiliser dans le contexte d’une étendue statique (méthode de classe).

Vous pouvez transformer votre variable d’instance en variable de classe en ajoutant un atsortingbut statique.

Vous pouvez faire de votre méthode de classe une méthode d’instance en supprimant l’atsortingbut class.

Un autre exemple est que vous avez une classe comme:

 @obc class Album: NSObject { let name:Ssortingng let singer:Singer let artwork:URL let playingSong:Song // ... class func getCurrentlyPlayingSongLyric(duration: Int = 0) -> Ssortingng { // ... return playingSong.lyric } } 

vous aurez également le même type d’erreur comme:

 instance member x cannot be used on type x. 

C’est parce que vous assignez votre méthode avec le mot clé “class” (qui fait de votre méthode une méthode de type) et en utilisant comme:

 Album.getCurrentlyPlayingSongLyric(duration: 5) 

mais qui a défini la variable playingSong auparavant? D’accord. Vous ne devez pas utiliser de mot-clé de classe pour ce cas:

  // ... func getCurrentlyPlayingSongLyric(duration: Int = 0) -> Ssortingng { // ... return playingSong.lyric } // ... 

Maintenant, vous êtes libre de partir.

J’ai continué à avoir la même erreur en dépit de la static la variable. Solution: Nettoyer la construction, nettoyer les données dérivées, redémarrer Xcode. Ou raccourci Cmd + Maj + Alt + K

 UserNotificationCenterWrapper.delegate = self public static var delegate: UNUserNotificationCenterDelegate? { get { return UNUserNotificationCenter.current().delegate } set { UNUserNotificationCenter.current().delegate = newValue } } 

Votre problème initial était:

 class ReportView: NSView { var categoriesPerPage = [[Int]]() var numPages: Int = { return categoriesPerPage.count } } 

Le membre de l’instance ‘categoriesPerPage’ ne peut pas être utilisé sur le type ‘ReportView’

les messages précédents soulignent correctement, si vous voulez une propriété calculée , le signe = est errant.

Possibilité supplémentaire pour l’erreur:

Si votre intention était de “définir une valeur de propriété par défaut avec une fermeture ou une fonction” , il vous suffit de la modifier légèrement. (Remarque: cet exemple n’était évidemment pas destiné à le faire)

 class ReportView: NSView { var categoriesPerPage = [[Int]]() var numPages: Int = { return categoriesPerPage.count }() } 

Au lieu de supprimer le = , nous ajoutons () pour indiquer une fermeture d’initialisation par défaut. (Cela peut être utile lors de l’initialisation du code de l’interface utilisateur, pour que tout rest au même endroit.)

Cependant, la même erreur se produit exactement :

Le membre de l’instance ‘categoriesPerPage’ ne peut pas être utilisé sur le type ‘ReportView’

Le problème consiste à initialiser une propriété avec la valeur d’un autre. Une solution consiste à rendre l’initialiseur lazy . Il ne sera pas exécuté jusqu’à ce que quelqu’un accède à la valeur.

 class ReportView: NSView { var categoriesPerPage = [[Int]]() lazy var numPages: Int = { return categoriesPerPage.count }() } 

maintenant le compilateur est content!