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 set
willSet
& didSet
var numPages: Int {
get{
return categoriesPerPage.count
}
set(v){
self.categoriesPerPage = v
}
}
toestaan om = operator
als setter te gebruiken
myObject.numPages = 5
Antwoord 2, autoriteit 96%
Soms voegt Xcode bij het overschrijven van methoden class func
toe 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.
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 lazy
te 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
}
}