Próbuję przekonwertować część mojej klasy Obj-C na Swift. I kilka innych klas Obj-C nadal używających enum w tej przekonwertowanej klasie. Szukałem w dokumentach przedpremierowych i nie mogłem go znaleźć, a może przegapiłem. Czy istnieje sposób na użycie Swift enum w klasie Obj-C? Lub link do dokumentu tego wydania?
W ten sposób zadeklarowałem wyliczenie w moim starym kodzie Obj-C i nowym kodzie Swift.
mój stary kod Obj-C:
typedef NS_ENUM(NSInteger, SomeEnum)
{
SomeEnumA,
SomeEnumB,
SomeEnumC
};
@interface SomeClass : NSObject
...
@end
mój nowy kod Swift:
enum SomeEnum: NSInteger
{
case A
case B
case C
};
class SomeClass: NSObject
{
...
}
Aktualizacja: z odpowiedzi. Nie można tego zrobić w Swift starszej wersji niż 1.2. Ale według tego oficjalnego bloga Swift . W Swift 1.2, który został wydany wraz z XCode 6.3, możesz użyć Swift Enum w Objective-C, dodając @objc
przedenum
objective-c
enums
swift
myLifeasdog
źródło
źródło
Odpowiedzi:
Od wersji Swift 1.2 (Xcode 6.3) możesz. Po prostu poprzedź deklarację wyliczenia za pomocą
@objc
Bezwstydnie zaczerpnięte z Swift Blog
W Objective-C to by wyglądało
źródło
BearBlack
,BearGrizzly
iBearPolar
!Aby rozwinąć wybraną odpowiedź ...
Możliwe jest udostępnianie wyliczeń w stylu Swift między Swift i Objective-C przy użyciu
NS_ENUM()
.Wystarczy je zdefiniować w kontekście Objective-C przy użyciu
NS_ENUM()
i są udostępniane za pomocą notacji kropkowej Swift.Od używania Swift z kakao i Objective-C
Cel C
Szybki
źródło
if let a = MyEnum(rawValue: 12345)
gdzie 12345 nie jest częścią tego wyliczenia, wynik nie jest opcjonalny, ale jakieś nieprawidłowe wyliczenie.Z przewodnika Używanie Swift z kakao i Objective-C :
Więc nie, nie możesz użyć wyliczenia Swift w klasie Objective-C.
źródło
@objc
jak @DanielGalasko wskazał w swojej odpowiedzi poniżej !!!@obj enum MyEnum: Int
, będzie działać dobrze na plikach Objective-C, jak wspomniano wcześniej. Jeśli twoje wyliczenie jest zadeklarowane z innym surowym typem wartości, takim jak@obj enum MyOtherEnum: String
, nie będziesz mógł go użyć w plikach Objective-CSwift 4.1, Xcode 9.4.1:
1) Swift wyliczenie musi mieć prefiks
@objc
i byćInt
typu:2) Nazwa celu-C to nazwa wyliczenia + nazwa przypadku, np .
CalendarPermissionAuthorized
:I oczywiście pamiętaj, aby zaimportować swój nagłówek mostkowania Swift jako ostatni element na liście importu pliku Objective-C:
źródło
Jeśli wolisz zachować kody ObjC bez zmian, możesz dodać do projektu plik nagłówka pomocnika:
w pliku nagłówkowym dodaj ten typ wyliczenia:
W pliku .m może znajdować się inne miejsce na dokonanie zmiany: włączenie ukrytego pliku nagłówkowego:
zastąp [YourProjectName] nazwą swojego projektu. Ten plik nagłówkowy uwidacznia wszystkie klasy @objc zdefiniowane w języku Swift, wyliczenia w ObjC.
Możesz otrzymać ostrzeżenie o niejawnej konwersji z typu wyliczenia ... Jest OK.
Przy okazji, możesz użyć tego pliku pomocniczego nagłówka, aby zachować niektóre kody ObjC, takie jak stałe #define.
źródło
Jeśli (tak jak ja) naprawdę chcesz używać wyliczeń typu String, możesz stworzyć wyspecjalizowany interfejs dla Objective-c. Na przykład:
Oczywiście nie zapewni ci to wygody autouzupełniania (chyba że zdefiniujesz dodatkowe stałe w środowisku celu-c).
źródło
to może trochę bardziej pomóc
Opis problemu : - Mam wyliczenie w klasie swift, do której uzyskuję dostęp z innych klas swift, a teraz muszę uzyskać do niego dostęp z mojej jednej z obiektywnych klas C.
Przed uzyskaniem do niego dostępu z klasy celu-c: -
Zmiany dotyczące dostępu do niego z obiektywnej klasy c
i dodaj funkcję, aby przekazać ją do wartości
źródło
Po zbadaniu tego wciąż znajdowałem tylko częściowe odpowiedzi, więc stworzyłem cały przykład aplikacji Swift połączonej z celem C, która ma wyliczenia Swift używane przez kod Objective C i wyliczenia Objective C używane przez kod Swift. Jest to prosty projekt Xcode, który możesz uruchomić i eksperymentować. Został napisany przy użyciu Xcode 10.3 ze Swift 5.0
Przykładowy projekt
źródło
enum SwAnimal
brakuje wiodącego@obj
W przypadku, gdy próbujesz obserwować wyliczenie, które wygląda następująco:
to obejście pomogło mi.
Obserwowalna klasa:
@objc dynamic var observable: String?
utwórz swoją instancję wyliczenia w następujący sposób:
Klasa obserwatora:
private var _enumName: EnumName?
private let _instance = ObservableClass()
Stwórz
To jest to. Teraz za każdym razem, gdy zmieniasz
_enumName
klasę w obserwowalnej klasie, odpowiednia instancja w klasie obserwatora zostanie również natychmiast zaktualizowana.Jest to oczywiście uproszczona implementacja, ale powinna dać ci wyobrażenie, jak obserwować właściwości niezgodne z KVO.
źródło