2015-09-02 14 views
76

ho la seguente classe:membro di istanza non può essere utilizzato su tipo

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

compilazione non riesce con il messaggio:

membro di istanza 'categoriesPerPage' non può essere utilizzato su tipo 'ReportView'

Cosa significa?

+7

Supponendo di dichiarare una proprietà calcolata 'numPages' anziché una chiusura eliminare il segno di uguale:' var numPages: Int {return categoriesPerPage.count} ' – vadian

+0

Può essere spiegato in modo più preciso esattamente cosa questo messaggio di errore si intende? Lo sto vedendo in un contesto completamente diverso. –

+1

Quando dichiari un blocco nello scope della classe, come sopra, sei limitato a ciò che è disponibile nel tipo. Non hai accesso a nessun membro di istanza. – Aderstedt

risposta

72

Devi solo errore di sintassi quando dice = {return self.someValue}

Usa:

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

} 

se si vuole ottiene solo è possibile scrivere

var numPages: Int { 
    return categoriesPerPage.count 
} 

con il primo modo è anche possibile aggiungere osservatori come setwillSet & didSet

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

permettendo di utilizzare = operator come un setter

myObject.numPages = 5; 
+1

Oops, ho perso il segno di uguale. Grazie. – Aderstedt

+0

Stai dicendo che inizializzerai '' categoriesPerPage'', che è 2-dim array con '' v'' che è Int? – Dan

+0

@Dan Hai ragione, l'esempio è solo per dimostrare l'esempio di 'set', ovviamente non puoi assegnare' int' a '[int]' –

25

Per chiunque altro che inciampa su questo assicurarsi che non sta tentando di modificare la classe piuttosto che l'istanza! (a meno che tu non abbia dichiarato la variabile come statica)

es.

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

instanceOfMyClass.variable = 'Foo' // Right! 
+2

Questa è la differenza tra la variabile 'static' e' instance' variabile, 'MyClass.variable' è valida se la dichiarerai come variabile statica (condivisa tra tutte le istanze) –

+0

@DanielKrom buon punto grazie – Derek

5

Un altro esempio è, avete classe come:

@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 
    } 
} 

si riceverà anche lo stesso tipo di errore del tipo:

instance member x cannot be used on type x. 

È perché si assegna il metodo con "classe "parola chiave (che rende il metodo un metodo di tipo) e utilizza come:

Album.getCurrentlyPlayingSongLyric(duration: 5) 

ma chi ha impostato prima la variabile playingSong? Ok. Non dovresti usare la parola chiave class per quel caso:

// ... 

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

// ... 

Ora sei libero di andare.

8

Sta dicendo che hai una variabile di istanza (la var è visibile/accessibile solo quando hai un'istanza di quella classe) e stai provando ad usarla nel contesto di un ambito statico (metodo di classe).

È possibile rendere la variabile di istanza una variabile di classe aggiungendo un attributo statico.

È possibile rendere il metodo di classe un metodo di istanza rimuovendo l'attributo di classe.

Problemi correlati