Może to oczywiste, ale nie wiem, jak zadeklarować właściwości klasy w Objective-C.
Muszę buforować słownik dla każdej klasy i zastanawiać się, jak umieścić go w klasie.
objective-c
cocoa
oop
mamcx
źródło
źródło
.
Składnia -accessor nie jest związana z właściwościami w Objective-C, to po prostu skompilowane w skrótu dla każdej metody, która zwraca coś bez podejmowania jakichkolwiek args. W takim przypadku wolałbym to - osobiście wolę.
składnię dla każdego użycia, w którym kod klienta zamierza coś uzyskać, nie wykonywać akcji (nawet jeśli kod implementacyjny może utworzyć coś raz lub wykonać działania niepożądane) . Intensywne użycie.
składni powoduje również, że kod jest bardziej czytelny: obecność[…]
s oznacza, że coś znaczącego jest robione, gdy pobieranie używa.
składni zamiast tego.Korzystam z tego rozwiązania:
Okazało się, że jest niezwykle przydatny jako zamiennik wzoru Singleton.
Aby z niego skorzystać, po prostu uzyskaj dostęp do swoich danych za pomocą notacji kropkowej:
źródło
self
oznacza wewnątrz metody klasowej?self
to obiekt, który otrzymał wiadomość . A ponieważ klasy są również obiektami , w tym przypadkuself
oznaczaModel
@synchronized
?Jak widać w WWDC 2016 / XCode 8 ( co nowego w sesji LLVM @ 5: 05). Właściwości klasy można zadeklarować w następujący sposób
Zauważ, że właściwości klasy nigdy nie są syntetyzowane
źródło
static
zmienna ( ) musi być nadal zadeklarowana i używana, a metody jawnie zaimplementowane, tak jak poprzednio. Składnia kropkowa już wcześniej działała. W sumie brzmi to jak coś większego niż jest w rzeczywistości.Jeśli szukasz ekwiwalentu klasy
@property
, odpowiedź brzmi: „nie ma czegoś takiego”. Ale pamiętajcie@property
, w każdym razie to tylko cukier syntaktyczny; po prostu tworzy odpowiednio nazwane metody obiektowe.Chcesz stworzyć metody klasowe, które uzyskują dostęp do zmiennych statycznych, które, jak powiedzieli inni, mają tylko nieco inną składnię.
źródło
UIDevice.currentDevice.identifierForVendor
pracuje dla mnie.Oto bezpieczny sposób na zrobienie tego:
Te zmiany zapewniają, że fooDict jest tworzony tylko raz.
Z dokumentacji Apple : „dispatch_once - Wykonuje obiekt bloku raz i tylko raz na czas życia aplikacji”.
źródło
Initializer element is not a compile-time constant
.Począwszy od Xcode 8 Objective-C obsługuje teraz właściwości klas:
Ponieważ właściwości klas nigdy nie są syntetyzowane, musisz napisać własną implementację.
Dostęp do właściwości klasy uzyskuje się za pomocą normalnej składni kropek na nazwie klasy:
źródło
Właściwości mają wartości tylko w obiektach, a nie w klasach.
Jeśli chcesz zapisać coś dla wszystkich obiektów klasy, musisz użyć zmiennej globalnej. Możesz to ukryć, deklarując
static
w pliku implementacji.Możesz także rozważyć użycie specyficznych relacji między swoimi obiektami: przypisujesz rolę wzorca konkretnemu obiektowi swojej klasy i łączysz inne obiekty z tym wzorcem. Mistrz zachowa słownik jako prostą właściwość. Myślę o drzewie takim jak to używane do hierarchii widoków w aplikacjach Cocoa.
Inną opcją jest utworzenie obiektu dedykowanej klasy, która składa się zarówno ze słownika „klasy”, jak i zestawu wszystkich obiektów związanych z tym słownikiem. To jest jak
NSAutoreleasePool
w kakao.źródło
Począwszy od Xcode 8, możesz użyć atrybutu właściwości class, na który odpowiedział Berbie.
Jednak w implementacji należy zdefiniować moduł pobierający i ustawiający klasę dla właściwości klasy za pomocą zmiennej statycznej zamiast iVar.
Próbka. H
Próbka.m
źródło
Jeśli masz wiele właściwości na poziomie klasy, wzorzec singletonu może być w porządku. Coś takiego:
I
Teraz uzyskaj dostęp do swoich właściwości na poziomie klasy, takich jak to:
źródło
dispatch_once
tutaj.[Wypróbuj to rozwiązanie, to proste] Możesz utworzyć zmienną statyczną w klasie Swift, a następnie wywołać ją z dowolnej klasy Objective-C.
źródło