Mam te definicje w mojej funkcji, które działają
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Ale jeśli przeniosę „testStr” i „testStrLen” na poziom klasy, to się nie skompiluje. Mówi się, że „MyClass.Type nie ma elementu członkowskiego o nazwie„ testStr ”.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
Jak mogę to naprawić? Nie chcę płacić kary za odliczanie za każdym razem len ciągłego „testu”.
Na podstawie mojego zrozumienia poniższych komentarzy muszę to zrobić:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
Czy jest sposób, żebym nie musiał dwukrotnie wpisywać / wpisywać słowa „test”? Dzięki.
Odpowiedzi:
Być może fajnym idiomem do deklarowania stałych dla klasy w Swift jest po prostu użycie struktury o nazwie MyClassConstants, takiej jak poniżej.
W ten sposób twoje stałe będą objęte zakresem zadeklarowanej konstrukcji zamiast unosić się globalnie.
Aktualizacja
Dodałem statyczną stałą tablicową w odpowiedzi na komentarz z pytaniem o statyczną inicjalizację tablicy. Zobacz Array Literals w „The Swift Programming Language”.
Zwróć uwagę, że do zainicjowania tablicy można użyć zarówno literałów łańcuchowych, jak i stałej ciągu. Jednak ponieważ typ tablicy jest znany,
testStrLength
nie można użyć stałej liczby całkowitej w inicjatorze tablicy.źródło
static
stałych wStruct
i weClass
?MyClassConstants.testStr.rawValue
aby uzyskać dostęp do wartości, która nie jest tak przyjazna składniowo jak zwykłaMyClassConstants.testStr
.Dodawanie do odpowiedzi @ Martina ...
Jeśli ktoś planuje przechowywanie stałego pliku na poziomie aplikacji, można pogrupować stałą na podstawie ich typu lub charakteru
Połączenie :
Constants.MixpanelConstants.activeScreen
AKTUALIZACJA 05.05.2019 (trochę poza tematem, ale 🤷🏽♂️)
Po przeczytaniu kilku wskazówek dotyczących kodu i osobistych doświadczeń wydaje się, że struktury nie są najlepszym podejściem do przechowywania stałych globalnych z kilku powodów. Zwłaszcza powyższy kod nie zapobiega inicjalizacji struktury. Możemy to osiągnąć, dodając jakiś standardowy kod, ale jest lepsze podejście
ENUMS
To samo można osiągnąć, używając wyliczenia z bezpieczniejszą i bardziej przejrzystą reprezentacją
źródło
Jeśli dobrze rozumiem twoje pytanie, pytasz, jak możesz stworzyć stałe na poziomie klasy (statyczne - w języku C ++) tak, aby a) nie powielać narzutu w każdym przypadku i b musisz ponownie obliczyć to, co w innym przypadku jest stałe.
Język ewoluował - jak każdy czytelnik wie, ale gdy testuję to w Xcode 6.3.1, rozwiązaniem jest:
Nie wiem, czy statyczne jest absolutnie konieczne, ponieważ kompilator z pewnością dodaje tylko jeden wpis na zmienną const do sekcji statycznej pliku binarnego, ale ma to wpływ na składnię i dostęp. Za pomocą statycznych, można zwrócić się do niego nawet wtedy, gdy nie masz instancji:
MyClass.testStrLen
.źródło
Jeśli faktycznie chcesz mieć statyczną właściwość swojej klasy, nie jest ona obecnie obsługiwana w języku Swift. Obecnie radzimy obejść ten problem za pomocą stałych globalnych:
Jeśli zamiast tego chcesz, aby były to właściwości instancji, możesz użyć leniwej przechowywanej właściwości dla długości - zostanie ona oceniona tylko przy pierwszym dostępie, więc nie będziesz jej obliczać w kółko.
źródło
A co z wykorzystaniem obliczonych właściwości?
źródło
Niektórzy mogą chcieć, aby niektóre stałe klasy były publiczne, a inne prywatne.
private słowo kluczowe może służyć do ograniczenia zakresu stałych w tym samym pliku Swift.
Inne klasy będą miały dostęp do stałych klas, jak poniżej
źródło
Próbowałem na placu zabaw
źródło