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 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}
. Le =
n'est pas nécessaire.
Utilisation :
var numPages: Int {
get{
return categoriesPerPage.count
}
}
si vous voulez obtenez seulement vous pouvez écrire
var numPages: Int {
return categoriesPerPage.count
}
avec la première façon, vous pouvez également ajouter des observateurs sous la forme set
willSet
& didSet
var numPages: Int {
get{
return categoriesPerPage.count
}
set(v){
self.categoriesPerPage = v;
}
}
permettant d'utiliser = operator
comme setter
myObject.numPages = 5;
Pour ceux qui trébuchent, assurez-vous de ne pas essayer de modifier la classe plutôt que l'instance! (sauf si vous avez déclaré la variable statique)
par exemple.
MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'
instanceOfMyClass.variable = 'Foo' // Right!
Cela signifie que vous avez une variable d'instance (la var 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 statique.
Vous pouvez faire de votre méthode de classe une méthode d'instance en supprimant l'attribut de classe.
Un autre exemple est, vous avez classe comme:
@obc class Album: NSObject {
let name:String
let singer:Singer
let artwork:URL
let playingSong:Song
// ...
class func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
// ...
return playingSong.lyric
}
}
vous obtiendrez é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" (ce 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 avant? D'accord. Vous ne devriez pas utiliser le mot-clé class pour ce cas:
// ...
func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
// ...
return playingSong.lyric
}
// ...
Maintenant, vous êtes libre de partir.
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 publications précédentes indiquent correctement si vous voulez une propriété calculée, le signe =
est errant.
Possibilité d'erreur supplémentaire:
Si votre intention était de "Définir une valeur de propriété par défaut avec une fermeture ou une fonction", vous devez également 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’UI, pour tout garder au même endroit.)
Cependant, le exact même erreur se produit:
Le membre de l'instance 'categoriesPerPage' ne peut pas être utilisé sur le type 'ReportView'
Le problème est d’essayer d’initialiser une propriété avec la valeur d’une autre. Une solution consiste à rendre l'initialiseur lazy
. Il ne sera pas exécuté tant que la valeur n'aura pas été accédée.
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
lazy var numPages: Int = { return categoriesPerPage.count }()
}
maintenant le compilateur est heureux!
J'ai continué à avoir la même erreur malgré la création de la variable static
. Solution: Nettoyez la construction, nettoyez les données dérivées, redémarrez 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
}
}
Juste au cas où quelqu'un aurait vraiment besoin d'un fermeture comme ça, cela peut se faire de la manière suivante:
var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
return {
return self.categoriesPerPage.count
}
}