Próbuję zaimportować Swift Protocol o nazwie AnalyticProtocol
do klasy Objective-C o nazwieAnalyticFactory
.
protocol AnalyticProtocol
{
}
Zaczynam od istniejącego projektu Objective-C (nie utworzyłem nowego projektu Swift z xCode i nie znalazłem, jak skonfigurować mój projekt Objective-C jako projekt Swift w xCode 6 ).
W swoim pliku Swift umieściłem .h
plik o nazwie, MyProjectName-Swift.h
ale kompilator zwrócił mi błąd informujący, że nie istnieje . Utworzyłem więc .h
plik o nazwie, MyProjectName-Swift.h
który jest właściwie pusty (nie wiem, co powinienem umieścić w środku).
W dokumentacji Apple powiedzieli, że muszę dołączyć mój .h
plik nazwany MyProjectName-Swift.h
do mojego .m
pliku. Ale muszę dołączyć go nie do mojego .m
pliku, ale do mojego .h
. Czy to może być problematyczne?
Podczas próby kompilacji pojawia się ten błąd:: 0: błąd: xxxAnalyticFactory.h: 39: nie można znaleźć deklaracji protokołu dla „AnalyticProtocol”
Oraz obciążony kod:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Myślę, że nie rozumiem dobrze, jak zaimportować protokół Swift do klasy Objective-C.
Czy ktoś widzi błąd w tym, co robię?
źródło
Odpowiedzi:
Musisz dodać
@objc
atrybut do swojego protokołu Swift w następujący sposób:źródło
@interface
w.h
pliku. jednak możesz dodać protokół do prywatnego@interface
w.m
pliku i to naprawia pewne rzeczy (przynajmniej czasami ma dla mnie). Więc powyżej twojego@implementation
mieć@interface MyController() <AnalyticProtocol>
.Nie jest możliwe zaimportowanie wygenerowanego przez Xcode nagłówka Swift w plikach nagłówkowych objC.
Tak więc, ponieważ chcesz użyć kodu Swift w pliku nagłówkowym objC, musisz „zadeklarować do przodu” klasy i protokoły, których chcesz użyć w pliku nagłówkowym objC, na przykład:
Możesz teraz użyć protokołu w deklaracji klasy objC:
W pliku implementacji (plik objC .m) można zaimportować wygenerowany przez Xcode plik nagłówka Swift („ProductModuleName-Swift.h”), a
AnalyticProtocol
kompilator będzie teraz wiedział o poprawnej implementacji .Jest to również opisane w sekcji „Używanie Swift z Objective-C” w Apple Docs
Zwróć uwagę, że XCode wyświetli ostrzeżenie w pliku nagłówkowym objC, gdy użyjesz protokołu zadeklarowanego do przodu („Nie można znaleźć definicji protokołu dla 'AnalyticProtocol' '), ale można to zignorować - implementację można znaleźć w czasie kompilacji.
źródło
No visible @interface for <ClassName> declares the selector <protocolMethodName>
Dla każdego, kto po prostu potrzebuje przyjąć protokół - możesz to zrobić w dwóch krokach, bez generowania żadnych ostrzeżeń ani błędów:
W swoim
.swift
pliku dodaj@objc
przed nazwą protokołu:W swoim
.m
pliku zaimportuj wygenerowany nagłówek Swift i zastosuj protokół w prywatnej kategorii. (Plik nagłówkowy nazywa się automagicznie):To jest zalecane podejście Apple. Możesz dowiedzieć się więcej o mieszaniu i dopasowywaniu Objective-C i Swift tutaj: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
źródło
#import "AnalyticProtocol-Swift.h"
. Wygląda na to, że WhatersProtocol-Swift.h nie jest generowany automatycznie, jak powiedziałeś.Jeśli tworzysz framework, wymagany plik import
zmiany w:
W takim przypadku musisz również upublicznić protokół Swift :
źródło
Możemy używać szybkich protokołów w Objective C z kilkoma zmianami w kodzie. Ponadto zadeklarowane protokoły @objc pozwalają na opcjonalne i wymagane metody bez domyślnych implementacji. Ma wady i zalety.
W rzeczywistości moglibyśmy zmienić nazwę protokołu na bardziej opisową, gdy używam go w celu C. Używam „@objc (alias_name)”.
Oto kod, miejmy szybki protokół z atrybutem @objc i nazwą aliasu do użycia w kodzie ObjC.
Teraz niech Farword zadeklaruje nasz protokół w pliku .h
Możesz teraz dostosować się do tego protokołu w pliku .m i dodać wymaganą implementację metod.
źródło