2015-08-19 8 views
26

Mam projekt iOS napisany z Objective-C. W projekcie utworzyłem klasę Swift, plik nagłówkowy pomostu dla uzyskania celu-c w Swift jest generowany pomyślnie i działa dobrze.importuj klasę swift w obiekty-c, <myModule> -Swift.h plik nie został znaleziony

Mój problem jest odwrotny. Chcę zaimportować klasę Swift w kodzie celu-c.

w Xcode, docelowe -> Budowanie Ustawienia -> Swift Compiler sekcja widzę Objective-C Generated Interface Header Name pole z wartością myModule-Swift.h, ale kiedy importować ten nagłówek w moim objective-c Klasa:

#import "myModule-Swift.h" 

otrzymuję błąd kompilatora:

myModule-Swift.h file not found 

w projekcie, nie mogę znaleźć tego pliku albo. Jak mogę rozwiązać ten problem?

Moja wersja Xcode jest 6,4

+0

Co masz na myśli klasy? Nie pokazuję żadnej klasy. myModule-Swift.h to kod nagłówka, który powinien generować. – user842225

Odpowiedz

49
  1. idź do
    Budowa Ustawienia-> Objective-C Generated interfejsu nazwę nagłówka
    i ustawić wartość YourModule-Swift.h (zazwyczaj jest to już ustawiony, to jest nazwa pliku trzeba importować na .m pliku #import "YourModule-Swift.h"

  2. Go zbudować Ustawienia i szukać „Definiuje Module”, ustaw obie wartości na TAK

  3. Utwórz klasę w szybkich z prefiksem @objc np
    @objc class mySwiftClass{...}

  4. Go do window-> Projekty i naciśnij przycisk usuwania na „Odczytane dane”

  5. Budowanie projekt ponownie

  6. powinny Pracuj teraz.

dlaczego dodać @objc?

A Swift class or protocol must be marked with the @objc attribute to be accessible and usable in Objective-C.

to @objc prefiks, informuje kompilator do generowania do szybkiej klasie plik nagłówka. doda ją do pliku "mymodule-Swift.h", na przykład:

@objc class MyCustomViewController : UIViewController {..} 

wygeneruje ten kod:

SWIFT_CLASS("_TtC10MyCustomViewController4ViewController") 
@interface ViewController : UIViewController 
- (void)viewDidLoad; 
- (void)viewDidAppear:(BOOL)animated; 
- (void)didReceiveMemoryWarning; 
- (SWIFT_NULLABILITY(nonnull) instancetype)initWithNibName:(NSString * __nullable)nibNameOrNil bundle:(NSBundle * __nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER; 
- (SWIFT_NULLABILITY(nonnull) instancetype)initWithCoder:(NSCoder * __nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER; 
@end 

pozwalając Objective-C, aby wiedzieć, że klasę.

+1

Czy mógłbyś wyjaśnić cel prefiksu @objc? – user842225

+0

btw, dodany krok 1.5, wyjaśni za chwilę –

+0

@ user842225 czy to działa? –

2

Dla mnie problem polegał na tym, że miałem przy sobie Bitcode. Kiedy kliknąłem "Aktualizacja zalecanych ustawień projektu", zmieniło się kilka ustawień, które prawdopodobnie sprawcy. Przekręciłem "Enabled Bitcode" na "No" w ustawieniach budowania i zostało to naprawione.

enter image description here

0

wpadłem na tym samym numerze wczoraj i pracował przez wiele godzin, aby naprawić go bezskutecznie. Inni mogli być na tej samej łodzi co ja. Wykonałem wszystkie opisane wyżej czynności, ale nic nie działało.

Przyczyną mojego łamania było to, że w całym projekcie były artefakty nazw projektów (od niewłaściwej zmiany nazwy).

Jeśli wszystkie powyższe kroki się nie powiodą, sugerowałbym, aby tak jak ja i zmienić nazwę projektu, aby Xcode mógł zresetować coś ... To rozwiązało problem dla mnie. To działa jak czar!

8

OMG .. rzeczywisty oświadczenie import nie był „class-Swift.h”, ale raczej „Nazwa_projektu-Swift.h”

można znaleźć nazwę pliku, jeśli spojrzeć pod build Ustawienia-> Swift Generowanie kodu kompilatora -> Wygenerowany przez interfejs Objective Header Nazwa

Plik nie został wygenerowany po przeciągnięciu źródła Swift do GUI. Tylko wtedy, gdy kliknę prawym przyciskiem-> Dodaj plik do "projektu". Następnie poprosił o wygenerowanie plików nagłówkowych.

+0

po prostu importujemy "naszproject-Swift.h "w obiektywnym pliku c pracował – Nagarjun

+0

Możesz zobaczyć, co powinno być pod twoimi ustawieniami kompilacji TARGET -> Nazwa modułu produktu To nie może automatycznie być nazwa projektu/celu –

0

Ułożyłem to na pewien czas. W moim przypadku moja nazwa docelowa jest podobna do "my-app" przy użyciu myślnika jako części nazwy docelowej. Próbowałem #import "my-app-Swift.h", ale Xcode wciąż dawał mi błędy.

Wykopałem folder "DerivedData" i znalazłem "my_app-Swift.h". Więc jeśli używasz interesujących znaków dla nazwy celu. Możesz spróbować zastąpić je podkreśleniem _.

3

Mój dodatek do Daniel Kroms odpowiedź:

  • Nigdy nie dodawać -Swift.h nagłówek header. Nawet jeśli wydaje się, że działa. Dodaj tylko plik importu do pliku .m!

  • W przypadku wykorzystania w nagłówku klas szybkich, złożyć deklarację z przodu @class swiftclassname przed @interface

Wtedy zobaczysz swoje prawdziwe błędy w kodzie.

+1

co jeśli potrzebuję użyć szybkiego wyliczenia w pliku nagłówkowym? – AlexW

+0

@AlexW musisz przenieść go do .m –

Powiązane problemy