Instance-lid kan niet worden gebruikt op type

Ik heb de volgende klas:

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

Compilatie mislukt met het bericht:

Exemplaarlid ‘categoriesPerPage’ kan niet worden gebruikt op type
‘ReportView’

Wat betekent dit?


Antwoord 1, autoriteit 100%

Je hebt alleen een syntaxisfout als je = {return self.someValue}zegt. De =is niet nodig.

Gebruik:

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

als je alleen maarwilt, kun je schrijven

var numPages: Int {
     return categoriesPerPage.count
}

op de eerste manier kun je ook waarnemers toevoegen als setwillSet& didSet

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

toestaan ​​om = operatorals setter te gebruiken

myObject.numPages = 5

Antwoord 2, autoriteit 96%

Soms voegt Xcode bij het overschrijven van methoden class functoe in plaats van alleen func. Dan kun je in de statische methode geen instantie-eigenschappen zien. Het is heel gemakkelijk om het over het hoofd te zien. Dat was mijn geval.

voer hier de afbeeldingsbeschrijving in


Antwoord 3, autoriteit 43%

Voor iedereen die hierover struikelt, zorg ervoor dat u niet probeert de klasse aan te passen in plaats van de instantie! (tenzij je de variabele als statisch hebt gedeclareerd)

bijv.

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

Antwoord 4, autoriteit 18%

Het zegt dat je een instantievariabele hebt (de var is alleen zichtbaar/toegankelijk als je een instantie van die klasse hebt) en je probeert deze te gebruiken in de context van een statische scope (klassemethode).

U kunt van uw instantievariabele een klassevariabele maken door het kenmerk static/class toe te voegen.

Je maakt een instantie van je klasse en roept de instantiemethode op die variabele aan.


Antwoord 5, autoriteit 6%

Een ander voorbeeld is dat je een klasse hebt zoals:

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

u krijgt ook hetzelfde type fout als:

instance member x cannot be used on type x. 

Het is omdat u uw methode toewijst met het trefwoord “class” (waardoor uw methode een typemethode wordt) en als volgt gebruikt:

Album.getCurrentlyPlayingSongLyric(duration: 5)

maar wie heeft de variabele playingSong eerder ingesteld? OK. U moet in dat geval geen class-sleutelwoord gebruiken:

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

Nu ben je vrij om te gaan.


Antwoord 6, autoriteit 3%

Uw eerste probleem was:

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

Instance lid ‘categoriesPerPage’ kan niet worden gebruikt op type ‘ReportView’

vorige berichten wijzen er terecht op dat als je een berekende eigenschapwilt, het =teken foutief is.

Extra kans op fouten:

Als het uw bedoeling was om ‘Een standaardeigenschapswaarde instellen met een sluiting of functie’, hoeft u deze ook maar een klein beetje te wijzigen. (Opmerking: dit voorbeeld was daar duidelijk niet voor bedoeld)

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

In plaats van de =te verwijderen, voegen we ()toe om een ​​standaard initialisatieafsluiting aan te duiden. (Dit kan handig zijn bij het initialiseren van de UI-code, om alles op één plek te bewaren.)

De exact dezelfde fouttreedt echter op:

Instance lid ‘categoriesPerPage’ kan niet worden gebruikt op type ‘ReportView’

Het probleem is om een ​​eigenschap te initialiseren met de waarde van een andere. Een oplossing is om de initializer lazyte maken. Het wordt niet uitgevoerd totdat de waarde is geopend.

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

nu is de compiler tevreden!


Antwoord 7

Ik kreeg steeds dezelfde fout ondanks het maken van de variabele static.
Oplossing: schone build, schone afgeleide gegevens, start Xcode opnieuw. of snelkoppeling
Cmd + Shift+Alt+K

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

Antwoord 8

Voor het geval iemand zo’n afsluitingecht nodig heeft, kan dat op de volgende manier:

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}

Other episodes