Przeszukałem kilka postów, myślę, że nie mogę napisać rozszerzenia w ramach szybkiego i wywołać go z kodu Objective-C, prawda?
@objc podobnie jak atrybuty obsługują tylko metody, klasy, protokoły?
objective-c
swift
swift-extensions
sprhawk
źródło
źródło
Odpowiedzi:
Możesz napisać rozszerzenie Swift i używać go w kodzie Objective-C. Przetestowano za pomocą XCode 6.1.1.
Wszystko, co musisz zrobić, to:
utwórz rozszerzenie w Swift (bez
@objc
adnotacji)#import "ProjectTarget-Swift.h"
w klasie Objective-C (gdzie „ProjectTarget” reprezentuje cel XCode, z którym jest skojarzone rozszerzenie Swift)wywołać metody z rozszerzenia Swift
Aktualizacja: Jak wspomniano @Rizwan Ahmed, musisz dodać
@objc
adnotację:źródło
I okazało się, że w Swift 4.0 musiałem dodać
@objc
przed moim rozszerzeniem słów kluczowych w celu metod przedłużających Swift, by stać się widoczny przez instancji objc klasie byłem rozciągającej.W skrócie:
Konfiguracja konfiguracji plików:
W CustomClassExtension:
W moim AppDelegate.m:
źródło
@nonobjc
adnotację.To rozwiązanie działa dla Swift 2.2 i Swift 3 . Zauważ, że tylko rozszerzenia dla klas (nie dla struktur lub wyliczeń) będą dostępne z Objective-C.
Następnie #import „ProductModuleName-Swift.h” w pliku ObjC.
Szybki 4
źródło
public
jest potrzebny? U mnie działa dobrze bezpublic
modyfikatora. Czy zakładamy, że rozszerzenie nie znajduje się w tym samym projekcie, ale jest importowane z innego projektu?Jak opisano w innych odpowiedziach, importowanie wygenerowanego nagłówka Swift działa w większości przypadków .
Wyjątkiem jest sytuacja, gdy kategoria jest zdefiniowana dla typu pomostowego (tj. Rozszerzenie jest zdefiniowane na,
String
a nieNSString
). Kategorie te nie zostaną automatycznie połączone z ich odpowiednikami w celu C. Aby to obejść, musisz albo użyć typu Objective-C (i rzutować wartość zwracaną w kodzie Swift za pomocąas String
), albo zdefiniować rozszerzenie dla obu typów Swift i Objective-C.źródło
public extension NSString
. Jeśli pojawi się nierozwiązany identyfikator lub podobny błąd w czasie kompilacji, możesz ponownie rzutować z powrotem na String, np.,let sVal = self as String
A następnie wywołać niezbędny kod nasVal
mclaughlinj
powiedziałem, zarówno dla klasy NSString, jak i struktury StringZaimportuj nagłówek „#import” ProductModuleName-Swift.h ”do pliku objective-c i dodaj @objc przed swoim zakresem w pliku swift. Będzie działać dobrze w Swift 4.2 i Swift 5
źródło