web-dev-qa-db-fra.com

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

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?

114
Aderstedt

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 setwillSet & didSet

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

permettant d'utiliser = operator comme setter

myObject.numPages = 5;
114
Daniel Krom

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!
42
Derek

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.

14
Vlad

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.

6
mgyky

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!

2
bshirley

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
        }
    }
0
Naishta

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
    }
}
0
algrid