Mam stary projekt Objective-C i chcę wywołać nową funkcję i obiekt Swift, utworzyłem plik „ <ProjectName>-Bridging-Header.h
” i „ <ProjectName>-Swift.h
”
było mi łatwo wywołać funkcję ze Swift na Objective-C, ale mam problem z odwróceniem.
Utworzyłem więc prostą klasę „System.Swift”
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
teraz próbuję postępować zgodnie z dokumentacją tutaj i wewnątrz <...>-Swift.h
pliku, który to napisałem
@class System;
@interface System : NSObject
-(void)printSome;
@end
i zaimportowałem go do mojej klasy Objective-C. W tym momencie w mojej klasie Objective C (obecnie UIViewController) mojego kodu Objective-C próbuję wywołać metodę "printSome":
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
teraz mam następujący błąd:
Niezdefiniowane symbole dla architektury i386: „ OBJC_CLASS $ _System”, odniesienie do: objc-class-ref w „ObjectiveC_Class_That_Call_Swift_Object” .o ld: nie znaleziono symboli dla architektury i386 clang: błąd: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie)
źródło
Odpowiedzi:
Problem rozwiązany, wcześniej utworzyłem i dołączyłem nowy
.h
plik do mojej klasy Objective-C o nazwie<ProductModuleName>-Swift.h
ale, jak odkryłem później, ten krok nie jest konieczny, ponieważ kompilator tworzy niezbędny plik jako niewidoczny.Po prostu uwzględnij
<ProductModuleName>-Swift.h
w swojej klasie i powinno działać.źródło
@objc
prefiks.-Swift.h
Został automatycznie utworzony. Przyprawia mnie o ból głowy to, że mogę wywołać samą klasę, ale nie mogę wywołać w niej żadnej funkcji. Czy ktoś wie dlaczego?<productModuleName>-.Swift.h
(niemodel
).#import "My_Project-Swift.h"
.to dziwne, ale zadziała
1) Add @objc to Swift class 2) Add in .m #import "(ProjectName)-Swift.h" 3) Call from .h @class SwiftClass; 4)On SwiftClass click "Command" + Left Click (Apple Documantation) 5) To see "-Swift.h" -> click "Command" + Left Click
Aplikacja wygeneruje interfejs dla tej klasy w pliku -Swift.h
Przykład: SWIFT_CLASS ("_ TtC10Project17220PLHelper") @interface PLHelper
źródło
@objc (MyClassName)
(ProjectName)-Swift.h
, NIE(ClassName)-Swift.h
!3) @class SwiftClassName;
uratował mnieZałóżmy, że mamy ProjectName „MyFirstProjectOnSwift” i szybką nazwę klasy „mySwiftClass”, a klasą objectiveC jest „MyObjectiveCLass”
Następujące kroki to: -
źródło
Sprawdź plik -Swift.h, który ma importowany plik .m w celu-C:
#import <YourProjectName-Swift.h>
Kliknij tę linię i kliknij lewym przyciskiem myszy - Przejdź do definicji.
Ten plik powinien zostać dołączony automatycznie, a nie ręcznie.
źródło
Jeśli nadal nie widzisz swoich zajęć nawet po zaimportowaniu
<ProductModuleName>-Swift.h
.Upewnij się, że Twoja klasa jest podklasą klasy natywnej (np.
UIViewController
) Lub przynajmniej, jeśli jest to tylko klasa użytkowa, utwórz podklasęNSObject
. Twoja klasa powinna się teraz pokazać.źródło
Mała dodatkowa wskazówka dla każdego, kto natknie się na ten post i dla kogo inne odpowiedzi nie działają: być może będziesz musiał zadeklarować swoją klasę Swift jako „publiczną”.
Przykład:
@objc public class MySwiftClass: NSObject {
źródło
Zalecanym sposobem wykonywania kodu Swift z Objective-C w projektach, które są migrowane z Obj-C do Swift, jest użycie wzorca Bridge / Proxy.
import Foundation
@objc class AnalyticsPropertyBridge: NSObject {
private var analytics: AnalyticsManager = AnalyticsManager() @objc func refreshProperties() { self.analytics.set(AnalyticsProperty.clientType) }
}
#import "CallerModule.h"
3.a Importuj plik parasolowy:
#import "MyProject-Swift.h"
3.b Wezwij most.
[[AnalyticsPropertyBridge new] refreshProperties];
Korzyści: Twój szybki kod nie zostanie zabrudzony z @objc, ponieważ kod jest wywoływany z Objc. Z biegiem czasu ObjC zostanie zmniejszony w twoim projekcie, a ostatecznie panna młoda zostanie usunięta.
źródło
Dobry artykuł, jeśli ktoś nadal ma problemy.
Konfigurowanie interoperacyjności Swift i Objective-C
źródło