Mam następującą klasę:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
Kompilacja kończy się niepowodzeniem i pojawia się komunikat:
Nie można użyć elementu członkowskiego instancji „CategoriesPerPage” z typem „ReportView”
Co to znaczy?
swift
instantiation
getter-setter
computed-properties
Aderstedt
źródło
źródło
numPages
a nie zamknięcie, usuń znak równości:var numPages: Int { return categoriesPerPage.count }
categoriesPerPage
jest zdefiniowana jakovar
zamiastlet
.Odpowiedzi:
Po prostu masz błąd składni podczas mówienia
= {return self.someValue}
. Nie=
jest potrzebne.Posługiwać się :
jeśli chcesz dostać, tylko możesz pisać
w pierwszym przypadku możesz także dodać obserwatorów jako
set
willSet
&didSet
pozwalając na użycie
= operator
jako seterźródło
categoriesPerPage
, która jest 2-dim tablicą, zv
którą jest Int?set
przykład, z-oczywiście nie można przypisaćint
do[int]
Dla każdego, kto się na to natknie, upewnij się, że nie próbujesz modyfikować klasy, a nie instancji! (chyba że zadeklarowałeś zmienną jako statyczną)
na przykład.
źródło
static
zmienną ainstance
zmienną,MyClass.variable
jest ważne, jeżeli będziesz zadeklarować ją jako zmienną statyczną (dzielone pomiędzy wszystkich przypadkach)Mówi się, że masz zmienną instancji (zmienna jest widoczna / dostępna tylko wtedy, gdy masz instancję tej klasy) i próbujesz jej użyć w kontekście zakresu statycznego (metoda klasy).
Możesz uczynić zmienną instancji zmienną klasową, dodając atrybut static / class.
Tworzysz instancję swojej klasy i wywołujesz metodę instancji dla tej zmiennej.
źródło
Inny przykład to:
otrzymasz również błąd tego samego typu, jak:
Dzieje się tak, ponieważ przypisujesz metodę za pomocą słowa kluczowego „class” (co sprawia, że metoda jest metodą typu) i używasz:
ale kto wcześniej ustawił zmienną playingSong? Dobrze. W takim przypadku nie powinieneś używać słowa kluczowego class:
Teraz możesz iść.
źródło
Czasami Xcode, gdy nadpisuje metody, dodaje
class func
zamiast po prostufunc
. Wtedy w metodzie statycznej nie widać właściwości instancji. Bardzo łatwo to przeoczyć. To był mój przypadek.źródło
Twoim początkowym problemem był:
poprzednie posty poprawnie wskazują, że jeśli chcesz obliczonej właściwości ,
=
znak jest błędny.Dodatkowa możliwość błędu:
Jeśli Twoim zamiarem było „Ustawianie domyślnej wartości właściwości za pomocą zamknięcia lub funkcji” , wystarczy tylko nieznacznie ją zmienić. (Uwaga: ten przykład oczywiście nie miał tego robić)
Zamiast usuwać
=
, dodajemy()
aby wskazać domyślne zamknięcie inicjalizacji. (Może to być przydatne podczas inicjowania kodu interfejsu użytkownika, aby zachować wszystko w jednym miejscu).Jednak występuje dokładnie ten sam błąd :
Problemem jest próba zainicjowania jednej właściwości wartością innej. Jednym z rozwiązań jest utworzenie inicjatora
lazy
. Nie zostanie wykonana, dopóki wartość nie zostanie uzyskana.teraz kompilator jest szczęśliwy!
źródło
Ciągle otrzymywałem ten sam błąd pomimo tworzenia zmiennej
static
. Rozwiązanie: Clean Build, Clean Derived Data, Restart Xcode. Lub skrót Cmd + Shift + Alt + K.źródło
Na wypadek, gdyby ktoś naprawdę potrzebował takiego zamknięcia , można to zrobić w następujący sposób:
źródło