Przejdź do nagłówka Cel C, nie utworzony w Xcode 6

242

Niedawno pracowałem nad dodaniem Swift do istniejącego projektu, aby wypróbować go w świecie rzeczywistym.

Po dodaniu do projektu pliku źródłowego Swift nie mam problemów z uzyskaniem „Bridging Header”, czyli Objective-C do Swift.

Ale nigdzie nie można znaleźć *-Swift.hpliku nagłówkowego, który ma ujawniać klasy Swift oznaczone @objclub podklasy klas ObjC :-(

Nie widzę żadnych konkretnych instrukcji, jak osiągnąć wykorzystanie mojej nowej podklasy, napisanej w Swift, w moim głównym kodzie aplikacji (który wciąż jest celem C).

Aplikacja, której jestem głównym programistą, ma dość dużą bazę kodową (70 000 linii), więc nie ma możliwości przeniesienia jej za jednym razem.

David Kristensen
źródło
5
Tak. Naprawdę pyta, gdzie w XCode IDE musisz coś zrobić, aby utworzyć nagłówek Swift-> ObjC, ponieważ nie dzieje się to „domyślnie” podczas dodawania kodu Swift do istniejącego projektu ObjC.
David Kristensen
5
@Popeye Nie zgadzam się. W takim przypadku, jeśli edytujesz pliki i kompilujesz z wiersza poleceń, nie zobaczysz tego problemu. Problemem jest IDE, które wykonuje (lub powinno wykonać) w Twoim imieniu. Jest to najprawdopodobniej związane z konfiguracją projektu, która jest zdecydowanie funkcją IDE
gaige
11
@Peyeye Z dokumentów (PDF) : Podczas importowania kodu Swift do Objective-C polegasz na wygenerowanym przez Xcode pliku nagłówkowym , który wystawia te pliki na Objective-C. (Moje pogrubienie, kursywa Apple). To jest wyraźnie pytanie o funkcję Xcode, która pomaga używać Swift i Objective-C razem, a wszystkie trzy tagi są z pewnością odpowiednie.
Caleb
3
Rozwiązałem go przy pomocy gaige i dokumentacji. I nie tylko rzucam tagiem: w tym przypadku plik nagłówkowy MUSI zostać utworzony przez XCode i widoczny dla niego. Nie było, co powodowało błędy.
David Kristensen
3
@Peyeye Nic nie jest zniekształcone - skopiowałem cytat bezpośrednio ze strony 46. Znalazłeś podobny, ale inny fragment, który mówi mniej więcej to samo.
Caleb

Odpowiedzi:

165

Teraz działa.

  1. Projekt musi mieć nazwę modułu produktu, która nie zawiera spacji.
  2. Definicja Moduł musi być ustawiony na Tak w Ustawieniach kompilacji, w części Opakowanie.

Wreszcie działa. Dziękujemy wszystkim za pomoc :-)

David Kristensen
źródło
64
W Build Settingsunder Packagingmój Defines Modulejest ustawiony na Yesi utworzyłem Product Module Namebez spacji. „* -Swift.h” nie jest generowany przez XCode 6. ???
Loozie
25
Jedna dodatkowa uwaga: najpierw próbowałem ustawić wspomniane właściwości na poziomie docelowym i to nie działało, plik „* -Swift.h” nie został wygenerowany. Działało, kiedy ustawiłem to na poziomie projektu.
Marcin
22
Mam również ten sam problem. Mam Defines Moduleustawiony Yeszarówno dla projektu i cel oraz Product Module Nameokreślono, ze bez spacji , ale nie wydaje się uzyskać ten plik wygenerowany.
Craig Otis
8
Na wypadek, gdyby inni byli tak zdezorientowani jak ja ... Musiałem mieć ślepe szczęście i po prostu zaimportować nagłówek, ponieważ nie byłby on automatycznie uzupełniany.
shawnwall
14
Nie można importować -swift do plików nagłówkowych (.h) tylko w implementacji.
zirinisp,
122

Miałem podobny problem i stwierdziłem, że można tylko dodać

#import "ProductModuleName-Swift.h"

do plików obj-c .m, a nie plików .h, aby znaleźć nagłówek parasola

macduff
źródło
2
Jest to poprawne i ... co jeśli potrzebuję użyć klasy Swift w nagłówku objc? Próbowałem z deklaracją przesyłania dalej, to również nie działa.
Ixx
2
Ups, przepraszam, deklaracja przekazania działa. Zapomniałem dodać średnik: P
Ixx
14
Dla przyszłych użytkowników: w nagłówkach prześlij deklarację, wykonując @class YourSwiftClass w górnej części plików .h (zamiast importować nagłówek parasola)
rogueleaderr
4
Co jeśli muszę użyć wyliczenia Swift w pliku nagłówkowym?
jakecraige
1
Ponadto, jeśli „#import ProductModuleName-Swift.h” znajduje się w dowolnym pliku nagłówkowym, wówczas plik ProductModuleName-Swift.h nie zostanie w ogóle wygenerowany (od Xcode 7.2), więc jeśli został usunięty (np. Przez wyczyszczenie kompilacji folder), wtedy zobaczysz komunikaty o błędach wszędzie, gdy plik jest importowany, nawet w przypadku plików .m, co powoduje zamieszanie.
przedłużenie
59

Odkryłem, że muszę naprawić wszystkie błędy kompilacji, zanim wygeneruje plik.

Problem polegał na tym, że był to problem z kurczakiem / jajkiem, ponieważ nie widziałem żadnych błędów kompilacji, dopóki nie skomentowałem #importoświadczenia:

//#import "ProductModuleName-Swift.h"

co ujawniło wiele innych błędów w moim kodzie Swift.

Kiedy naprawiłem te nowe błędy i udało mi się zbudować źródło, odkomentowałem #importbingo! Nagłówek został utworzony i importowany poprawnie :)

petehare
źródło
Dzięki, właśnie to mnie trzymało. Po naprawieniu błędów szybkiej kompilacji byłem gotowy. (Wersja Xcode 6.1.1)
Rick Roberts
10
To świetny punkt i dobry powód, aby włączyć ustawienie „kontynuuj budowanie po błędach” w Xcode.
Kendall Helmstetter Gelner
To też dokładnie mój przypadek: brak -Swift-h wydarzyło się po tych samych zmianach w szybkim kodzie źródłowym
Giorgio Calzolato,
3
po zobaczeniu problemu z kurczakiem / jajkiem zdaję sobie sprawę z mojego problemu, Dobra analogia
d0ye
Ten problem zawsze do mnie wracał (Xcode10) i właśnie zinterpretowałem Xcode jako błędny. To była odpowiedź
SumakuTension
44

Jeśli jesteś podobny do mnie, prawdopodobnie masz nieprawidłową nazwę nagłówka. Po uderzeniu głową przez chwilę szukałem pliku w DerivedData i na pewno tam jest. W moim ustawieniu (przy użyciu standardowego folderu danych pochodnych):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

Znajdziesz to. Jeśli nic w tym folderze nie pasuje, Xcode go nie generuje.

Używam Xcode w wersji 6.2 (6C86e)

Lou Zell
źródło
Zrobiło to dla mnie. Myślałem, że autouzupełnianie wykryje, że po prostu założyłem, że go nie ma. Widząc w katalogu, wszystko się wyjaśniło.
Czy
Czasami widzenie to wiara. Nie byłem w stanie sprawnie działać, dopóki nie podążyłem za zalecaną odpowiedzią, a następnie wykonałem te kroki, aby znaleźć wygenerowany nagłówek, który, ku mojemu zdziwieniu, został postfiksowany, -Swift.ha nie nazwą mojego rzeczywistego pliku Swift. Dziękuję Ci!
Josh Habdas
Dzięki! Zaoszczędził mi dużo czasu
estemendoza
43

Jeśli w nazwie modułu projektu znajdują się spacje, należy zastąpić je spacją.

Na przykład, jeśli nazwa twojego projektu to „Mój projekt”, możesz użyć:

#import „My_Project-Swift.h”

JohnMorrison
źródło
12
Jeśli nazwa modułu projektu zawiera myślniki, należy je również zastąpić znakiem podkreślenia. Więc jeśli nazwa twojego projektu to „My-Project”, użyj #import „My_Project.h”
Jeff Ames
6
Ponadto, jeśli nazwa modułu projektu zaczyna się od cyfry, należy ją również zastąpić znakiem podkreślenia. „1st Project” to „_st_Project-Swift.h”
Danation
31

* Jedyną ważną rzeczą jest: *

aby użyć zdefiniowanej „Nazwy modułu produktu” w celu, a następnie -Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

Bez względu na to, czy parametr „Definiuje moduł” jest ustawiony na Tak czy Nie, czy też projekt „Nazwa modułu produktu” nie jest ustawiony.

Przypomnienie: klasy Swift muszą pochodzić z NSObject lub zostały otagowane atrybutem @objc, aby być narażonym na ObjectiveC / Foundation || Kakao ...

Luc-Olivier
źródło
1
To prawda: nie ma potrzeby definiowania modułu w projekcie lub celu
Giorgio Calzolato,
25

Chciałem dodać jeszcze jeden powód, dla którego możesz mieć z tym problem - tworzyłem framework, który mieszał kod Swift i Objective-C. Nie byłem w stanie zaimportować klas Swift poza ramy - sprawdziłem, czy plik -Swift.h jest generowany, ale był pusty.

Problem okazał się bardzo, bardzo prosty - nie ogłosiłem żadnej z moich klas Swift publicznie! Jak tylko dodałem publiczne słowo kluczowe do klas, byłem w stanie użyć ich z klas wewnątrz i na zewnątrz frameworka.

Warto również zauważyć, że wewnątrz frameworka (tylko w plikach .m, jak wspomniano w innej odpowiedzi) musiałem zaimportować plik -Swift.h jako:

#import <FrameworkName/FrameworkName-Swift.h>
Kendall Helmstetter Gelner
źródło
2
W Framework zwracam również uwagę, że aby korzystać z klas Swift, powinny one zostać odziedziczone z NSObject (nawet @objc nie pomoże), a wszystkie metody / właściwości powinny być publiczne.
dmitrynikolaev
3
Przynajmniej w bieżącej wersji wstępnej XCode 7, dopóki nie odziedziczysz po NSObject, nie będą one dostępne w wygenerowanym szybkim nagłówku.
dmitrynikolaev
100% NIE naprawiło mojego problemu. KAŻDYM rozwiązaniem jest „upublicznij swoje zajęcia”. Ja to zrobiłem. Kropka. Nadal NIE ujawnia klas Swift w projektach korzystających z frameworka.
datWooWoo
@lespommes, powinieneś napisać pytanie i postawić przykładowy projekt gdzieś, który pokazuje problem, ktoś może dowiedzieć się, co się dzieje ... Właśnie podałem swoją odpowiedź jako jedno z możliwych rozwiązań, ponieważ popełniam błąd widoczności, który popełniam najczęściej często.
Kendall Helmstetter Gelner
2
O tak, twoja wskazówka dotycząca importu w końcu załatwiła sprawę! Wielkie dzięki!
endowzoner
14

Miałem ten sam problem. Wygląda na to, że musisz dostosować ustawienia (definiuje nazwę modułu i moduł produktu) przed dodaniem pierwszego pliku Swift.

Jeśli zrobisz to później, plik „* -Swift.h” nie zostanie wygenerowany dla tego projektu, nawet jeśli dodasz kolejne pliki Swift lub usuniesz plik Swift i utworzysz nowy.

użytkownik3540830
źródło
Nie jestem pewien, czy to prawda. Nie zdecydowałem się włączyć „Defines Module”, dopóki nie utworzyłem wielu szybkich plików i udało mi się uzyskać -Swift.h w porządku.
Michael Peterson
Smutno mi powiedzieć, że to właśnie miałem problem :( Musiałem usunąć .swift i dodać go ponownie, a potem wszystko działało.
StuFF mc
2
Co teraz? Jestem w trakcie zmiany zarówno kodu Swift, jak i ObjC. Mój Project-Swift.h nie aktualizuje się. Próbowałem nawet usunąć plik nagłówka.
Suhail Bhat,
2
Musiałem to napisać, dev.iachieved.it/iachievedit/?p=980 . Wskazówka dotycząca aktualizacji ustawień kompilacji przed dodaniem plików Swift była dla mnie kluczowa.
Joe
Czy to oznacza, że ​​musiałbym odtworzyć projekt i ponownie dodać wszystko, gdybym tego nie zrobił? Bez względu na to, co robię, nie mogę wygenerować pliku * -Swift.h.
kgreenek
13

Pozwólcie, że podzielę się swoimi doświadczeniami, próbując używać Swift w starym projekcie objc. I nie trzeba było ustawić Defines modulesię YES.

W moim przypadku musiałem ręcznie upewnić się, że istnieje nagłówek mostkujący objc. Tylko wygenerowana nazwa nagłówka interfejsu była obecna w moich ustawieniach kompilacji.

Brak nagłówka pomostowego

Doprowadziło to do wygenerowania pliku MyApp-Swift.h, ale bez żadnych śladów moich klas Swift.

Dokumentacja Apple mówi, że podczas dodawania pierwszego pliku szybkiego pojawi się monit o utworzenie nagłówka pomostowego. Cóż, nie byłem. Ręcznie dodałem MyApp-Bridging-header.hplik i wskazałem go w polu „Nagłówek mostkujący Objective-C”. To spowodowało, że mój plik MyApp-Swift.h został zapełniony moimi klasami Swift.

Dokumenty: importowanie programu Swift do celu C

Nicolai Dahl
źródło
tak, z jakiegokolwiek powodu mój plik ObjC Swift.h został wygenerowany z nagłówkami klasy Swift dopiero po dodaniu pustego mostkowego pliku nagłówka do projektu!
Andrew
To samo tutaj. Mój kod Swift nie został zaimportowany do wygenerowanego pliku * -Swift.h, dopóki nie dodałem pustego pliku nagłówkowego mostkowania Objective-C.
Nik
12

Oto kolejna odmiana modułu moduleName-Swift.h, która nie została wygenerowana.

Zdecydowałem się dołączyć wykresy IOS do mojego projektu, ale nie chciałem mieszać źródeł w tym samym katalogu, dlatego umieściłem folder Projekt wykresów obok folderu projektu mojego kodu. Przeciągnąłem projekt Wykresy do paska nawigacyjnego mojego projektu i zawarłem ramę na liście Osadzone pliki binarne mojego projektu w ogólnych ustawieniach projektu i ustawiłem opcję Osadzona zawartość zawiera kod Swift na Tak na karcie Ustawienia budowania w moim projekcie w sekcji Opcje budowania .

Plik moduleName-Swift.h mojego projektu nigdy nie wygenerowałby się, bez względu na inne sugerowane tutaj przełączniki lub ustawienia. W końcu, stosując metodę Lou Z do wyszukiwania plików -Swift.h, zobaczyłem, że plik Charts-Swift.h został wygenerowany głęboko w katalogu xcode Build mojego projektu w Charts.framework / Headers /

Rozwiązaniem użycia pakietu ios-charts Daniela Gindi Swift bez uwzględnienia kodu w katalogu źródłowym mojego projektu było dodanie:

#import "Charts/Charts-Swift.h"

Do modułów sporządzających wykresy danych mojego projektu.

gjpc
źródło
Czy można zmieniać / dostosowywać podpowiedzi na wykresach IOS? jeśli tak, to czy możesz podać jeden przykład?
Amit Chauhan,
12

Nazwa pliku jest zawsze poprzedzona nazwą docelową . Jest to nazwa produktu, ale praktycznie jest to nazwa docelowa. Więc jeśli chcesz zbudować go dla nowego celu, przygotuj się na that_target-Swift.hplik.

Jednym ze sposobów rozwiązania tego problemu jest

  1. Dodaj preprocesor dla każdego celu, który jest nazwą samego celu (bez spacji). Dawny. MY_TARGET=1. Dodaj to w Ustawieniach projektu -> Ustawienia kompilacji -> Makra preprocesora dla każdego celu.
  2. Jeśli używasz pliku PCH,

Dodaj te linie do pliku PCH

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

Zaletą korzystania z pliku PCH jest to, że nie trzeba wszędzie dołączać nagłówków.

  1. Jeśli nie używasz pliku PCH, po prostu dodaj te same linie w jednym nagłówku i dołącz ten nagłówek tam, gdzie potrzebujesz użyć szybkich klas.

To powinno działać dobrze.

Deepak GM
źródło
Naprawdę lubię używać tego rozwiązania zamiast importować nagłówek bezpośrednio do twojego źródła. Mam skomplikowaną strukturę projektu, w której ten sam kod źródłowy jest używany przez wiele celów / projektów. Pozwala to uniknąć dodawania niechlujnej instrukcji #if #else w całym kodzie. Dziękuję za odpowiedź!
Ryan
To uratowało mi dzień. Umieszczam 5 wierszy kodu w pliku „Something-Swift-Headers.h” (z includenim zawartym ). Następnie importuję ten nowy plik z miejsca, w którym go potrzebuję. Wolę nie umieszczać tego w pliku PCH ani żadnym pliku .h, aby uniknąć cyklicznych zależności i używać nagłówka wygodnego w plikach .m.
ctietze
Jest to złe na tak wielu poziomach. Po pierwsze, .pchpliki są mocno odradzane . Po drugie, nazwa pliku zawiera nazwę produktu, a NIE nazwę docelową. To może być zbieg okoliczności, że jest taki sam, ale użył nazwy produktu!
Iulian Onofrei
10

Jeśli Xcode faktycznie generuje nagłówek -Swift.h (głęboko w DerivedData), ale nie odnosi się do twoich klas Swift, upewnij się, że masz również zdefiniowany nagłówek pomostowy. Sposób, w jaki czytałem dokumenty, sugerował, że potrzebowałem go tylko do wywołania Celu-C z Szybkiego, ale wydaje się to konieczne również do wywołania Szybkiego z Celu-C.

Zobacz moją odpowiedź: https://stackoverflow.com/a/27972946/337392

EDYCJA: Jest to spowodowane modyfikatorami dostępu publicznego vs. wewnętrznego, co ostatecznie znalazłem wyjaśnione w dokumentach Apple: -

Domyślnie wygenerowany nagłówek zawiera interfejsy dla deklaracji Swift oznaczonych modyfikatorem publicznym. Zawiera również te oznaczone wewnętrznym modyfikatorem, jeśli cel aplikacji ma nagłówek mostkujący Objective-C.

Rzut
źródło
Tak, to naprawdę pomogło. Nie wiedziałem tego. Pomyślałem, że jest to po prostu potrzebne w przypadku użycia Obj-C z Swift.
nodepond
Chętnie pomoże. Zredagowałem odpowiedź, ponieważ od tego czasu odkryłem przyczynę tego zachowania.
Echelon,
7

Popiera to, co ma tu wiele osób, ale dodaje odpowiedni zrzut ekranu. Kod Swift i Obj-C z pewnością mogą żyć razem. To nie jest gra typu wszystko albo żadna.

Aby uzyskać dostęp do plików Swift w Objective-C, wystarczy dodać to wywołanie do pliku Obj-C (w pliku .m / implementacji):

#import "{product_module_name}-Swift.h"

(Gdzie {nazwa_modułu_produktu} reprezentuje nazwę modułu produktu twojego projektu). Zamiast próbować odgadnąć nazwę modułu produktu lub dowiedzieć się, jakie są narożniki ze spacjami i znakami specjalnymi, po prostu przejdź do karty ustawień kompilacji w projekcie i wpisz „nazwa modułu produktu” - inspektor ujawni ci twoje. Mój był czymś, czego się nie spodziewałem. Sprawdź ten zrzut ekranu, jeśli jesteś zdezorientowany.

wprowadź opis zdjęcia tutaj

Aby kod Obj-c działał w Swift, wystarczy dodać plik nagłówka pomostowego i zaimportować tam odpowiednie nagłówki Obj-C.

Brian Sachetta
źródło
1
Nie powinno tak być #import?
Iulian Onofrei
Powiedzmy, że nazwa mojego projektu to ABC, a zatem „ABC-Swift.h” musi istnieć w moim projekcie, prawda? Nie mogę tego znaleźć Czy musisz go ręcznie utworzyć? Nie tworzę żadnych szybkich plików, w tym kakao, które jest napisane szybko.
nr5
Nagłówek pomostowy (w twoim przypadku ABC-Swift.h) nie jest tworzony automatycznie. Kiedy próbujesz utworzyć swój pierwszy plik Swift w projekcie Obj-C, Xcode zwykle wyświetla monit o jego dodanie. Możesz także utworzyć nagłówek mostkujący we własnym zakresie, jak pokazano tutaj (control + f dla „nagłówka pomostowego”): developer.apple.com/library/content/documentation/Swift/…
Brian Sachetta
5

Najważniejsze, że ten plik jest niewidoczny !!! Przynajmniej jest w Xcode6 beta5. W twoim obszarze roboczym nie będzie takiego pliku o nazwie „YourModule-Swift.h”. Upewnij się tylko, że masz nazwę modułu i zdefiniowano moduł ustawiony na tak, i użyj go w swojej klasie Objective-C.

użytkownik412759
źródło
5

Ok, oto wszystkie rzeczy, których naprawdę potrzebujesz!

1. Usuń wszystkie dodane przez siebie szybkie pliki i skompiluj kod bez żadnych błędów.

----------

wprowadź opis zdjęcia tutaj

----------

2. Przejdź do ustawień kompilacji „Projekty” i ustaw nazwę modułu produktu. Projekt musi mieć nazwę modułu produktu, która nie zawiera spacji.

----------

wprowadź opis zdjęcia tutaj

----------

3.Defines Moduł musi być ustawiony na Tak w Ustawieniach kompilacji, w Pakowaniu, w twoim projekcie, a nie docelowy!

----------

wprowadź opis zdjęcia tutaj

----------

4. Teraz utwórz szybki plik lub kontroler widoku w pliku-> nowy plik->

----------

wprowadź opis zdjęcia tutaj

----------

Poprosi o utworzenie nagłówka pomostowego, pozwoli mu to zrobić. Jeśli raz go odrzuciłeś, będziesz musiał ręcznie dodać -Bridging-Header.h

5. Dodaj @objc w kontrolerze, aby poinformować kompilator, że istnieje jakiś szybki plik, który musi zostać udostępniony ObjectiveC

----------

wprowadź opis zdjęcia tutaj

----------

6.Zbuduj projekt i zaimportuj #import „-Swift.h” do dowolnego kontrolera ObjectC, a on zadziała! Możesz kliknąć go klawiszem Command, aby zobaczyć rzeczywisty plik!

----------

wprowadź opis zdjęcia tutaj

----------

Mam nadzieję że to pomoże!

Kakshil Shah
źródło
>> Możesz kliknąć go klawiszem Command, aby zobaczyć rzeczywisty plik! To jest fajne
Jagan
4

Ta odpowiedź dotyczy przypadku użycia, w którym możesz już mieć kod Objective-C, który wywołuje klasy Swift, a następnie zaczynasz otrzymywać ten błąd.

Jak naprawić problem

Poniższe kroki ostatecznie rozwiązały wszystkie problemy dla mnie. Czytałem powyżej kogoś wspominającego o „kurczaku i jajku” i to właśnie ta koncepcja doprowadziła mnie do tej procedury. Ten jawny proces pokazuje, że należy usunąć kod Objective-C odwołujący się do klas Swift, dopóki nie zostanie wygenerowany nagłówek.

  1. Skomentuj instrukcję #import „ProductModuleName-Swift.h” w pliku implementacji Objective-C
  2. Skomentuj wszelkie odniesienia w pliku implementacji Cel-C do Swift Classes
  3. Clean & Build
  4. Rozwiąż wszystkie błędy / ostrzeżenia
  5. Usuń komentarz do instrukcji #import „ProductModuleName-Swift.h”
  6. Wyczyść i skompiluj (pomyślnie lub napraw wszelkie pozostałe błędy, sprawdź , czy nie odwołujesz się do żadnych klas Swift w Objective-C w tym momencie . Jeśli tak, tymczasowo je skomentuj)
  7. Sprawdź, czy „ProductModuleName-Swift.h” jest generowany przez kliknięcie Cmd na nazwę klasy instrukcji #import „ProductModuleName-Swift.h”
  8. Usuń komentarz do kodu odnoszącego się do klas Swift w pliku implementacji Objective-C.
  9. Wyczyść i zbuduj jak zwykle (należy wygenerować „ProductModuleName-Swift.h”, a kod Objective-C odwołujący się do klas Swift może być używany normalnie)

Nota Bene: Odpowiedzi na temat zmiany spacji na podkreślenia i moduł Definiowanie na TAK, jak podano powyżej, nadal obowiązują podczas wykonywania tego procesu, podobnie jak zasady określone w Dokumentacji Apple .

Bridging Header Path

W jednym błędzie nie znaleziono pliku ProductModuleName-Bridging-Header.h podczas kompilacji. Ten fakt spowodował błąd

<nieznany>: 0: błąd: mostkowanie nagłówka „/Users/Shared/Working/abc/abc-Bridging-Header.h” nie istnieje

Bliższa kontrola błędu wykazała, że ​​plik nigdy nie istniałby w opisanej lokalizacji, ponieważ był on faktycznie zlokalizowany ( zła ścieżka )

„/Users/Shared/Working/abc/abc/abc-Bridging-Header.h”. szybkie wyszukiwanie ustawień kompilacji celu / projektów w celu ręcznej korekty, a plik abc-Swift.h został ponownie wygenerowany automatycznie.

ustawienia kompilacji

Tommie C.
źródło
1
Co jeśli twój projekt jest tak duży, że komentowanie wszystkich odniesień do szybkiego kodu w celu c jest niepraktyczne?
Andrew Morris
3

Musisz zaimportować nagłówek do klas Objective-C, czyli:

#import “ProductModuleName-Swift.h”

Jest generowany automatycznie, na podstawie odwołania mówi: „Wszelkie pliki Swift w twoim celu będą widoczne w plikach .m Objective-C zawierających tę instrukcję importu”.

Anton
źródło
24
Ale kiedy to robię, pojawia się błąd kompilacji, AppName-Swift.h nie istnieje. Natomiast AppName-Bridging-Header.h istnieje.
David Kristensen
5
@DavidKristensen: Masz rozwiązanie ?, ponieważ utknąłem z tym samym problemem
BaSha,
2

Rzeczywisty plik w projekcie nie jest tworzony ([ProductModuleName] -Swift.h). Polecenie Cmd + kliknięcie importu albo generuje go w locie (i w pamięci), aby można było zobaczyć, jak wykonuje się połączenie, albo otwiera plik gdzieś w katalogu pamięci podręcznej Xcode, ale nie ma go w katalogu projektu.

Musisz ustawić Prop projektu modułu (w Ustawieniach kompilacji celu) na Tak, a jeśli nazwa modułu zawiera spacje lub myślniki - użyj _ we wszystkich importach pliku [ProductModuleName] -Swift.h.

Możesz zaimportować go we wszystkich plikach .h i .m, w których używasz szybkich typów, lub możesz zaimportować go w pliku .pch.

Więc jeśli mój moduł (projekt) ma nazwę „Projekt testowy”, zaimportuję go w następujący sposób, w pliku .pch mojego projektu (tylko tam):

#import "Test_Project-Swift.h"
Nikolay Tsenkov
źródło
2

Tylko heads-up dla każdego, kto używał „”. w tam nazwa projektu. Xcode zastąpi „.” z podkreśleniem „_” dla wersji Swift mostkowego pliku nagłówkowego. Co dziwne, wygenerowany Bridging-Header.h nie zastępuje okresów podkreśleniami.

Na przykład projekt o nazwie My.Project miałby następujące nazwy plików nagłówka pomostowego.

Bridging-Header.h (automatycznie generowany)

My.Project-Bridging-Header.h

Swift.h

My_Project.h

Mam nadzieję, że to pomoże każdemu, kto użył kropki i utknął tak jak ja. Ten plik można znaleźć w następującej lokalizacji.

Macintosh HD / Users / user /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

Dbać,

Jon

jonthornham
źródło
2

Projekt musi mieć nazwę modułu bez spacji. Definiuje Moduł musi być ustawiony na Tak w Ustawieniach kompilacji, w części Opakowanie. skomentował oświadczenie #import:

Jeśli nadal masz błąd podczas importowania pliku „ProductModuleName-Swift.h”, to

// # import "ProductModuleName-Swift.h"

co ujawniło wiele innych błędów w moim kodzie Swift.

Gdy naprawiłem te nowe błędy i udało mi się zbudować źródło, odkomentowałem #import i bingo! Nagłówek został utworzony i importowany poprawnie :)

j.krissa
źródło
Mój problem polegał na tym, że miałem również błędy w kodzie Swift, ale nie wiedziałem o tym, dopóki nie odkomentowałem pliku -Swift.h. Dzięki!
Czy
1

Znalazłem sztuczkę, która zawsze na mnie działa.

  1. Utwórz #import „ProductModuleName-Swift.h” w pliku appDelegate.h oraz w pliku ProductName-Prefix.pch. Jeśli nie masz go w xcode 6, możesz go utworzyć w ten sposób. Dlaczego ProjectName-Prefix.pch nie jest tworzony automatycznie w Xcode 6?
  2. Command + shift + k, aby wyczyścić kod, jeśli pojawi się błąd związany z plikiem „ProductModuleName-Swift.h”, usuń go z pliku appDelegate.h.
  3. Wyczyść kod ponownie. Teraz wszystko będzie działać jak urok
  4. Jeśli ponownie pojawi się błąd dotyczący „ProductModuleName-Swift.h”, teraz utwórz ponownie w pliku appDelegate.h i ponownie wyczyść kod.

Wykonaj tę pracę (usuń i utwórz plik „ProductModuleName-Swift.h” z pliku appDelegate.h i wyczyść kod) za każdym razem, gdy pojawi się ten błąd, aby go wyciszyć.

yannisalexiou
źródło
1

Znalazłem to rozwiązanie

  • Utwórz SwiftBridge.h
  • wstaw #import „ProductModuleName-Swift.h”
  • Ustaw ten plik .h jako publiczny (ważny) Wybierz plik -> W Pokaż inspektor plików (prawy pasek) -> Ustaw jako publiczny

Teraz możesz

#import "SwiftBridge.h"

zamiast ProductModuleName-Swift.h

Jest to rozwiązanie obejścia problemu. Myślę, że ten problem zostanie rozwiązany w następnej wersji Xcode. Powodzenia

TOT FOURLEAF
źródło
Nie działa Właśnie tego spróbowałem. W wierszu #import “ProductModuleName-Swift.h”pojawia się błąd w pliku SwiftBridge.h zamiast oryginalnego pliku kodu Objective-C.
Supertecnoboff,
1

Trudno mi było określić import mojego nagłówka swift do nazwy modułu / celu-c. Przeczytałem tutaj również wiele artykułów.

Ale ostateczna odpowiedź na nazwę projektu ze wszystkimi zawartymi w niej znakami specjalnymi (czy to „.”, Cyfrą czy spacją) - możesz znaleźć tekst, który będzie dla ciebie działał w „ nazwie modułu produktu ” w Ustawieniach kompilacji celu .

Na przykład moja nazwa docelowa zaczynała się cyfrą - „1mg”, a wspomniane powyżej pole zawierało „_mg” jako nazwę mojego modułu.

więc użyłem #import „_mg-Swift.h” i zadziałało.

Nazwa modułu produktu w ustawieniach kompilacji celu podaje prawidłową nazwę modułu, która będzie działać dla twojego projektu

Keroberos
źródło
Jeśli możesz edytować link do zrzutu ekranu, mógłbym edytować twoją odpowiedź, aby wyświetlić ją dla ciebie.
SuperBiasedMan
1

W moim przypadku musiałem ustawić cel wdrożenia co najmniej na „OS X 10.9”, a -Swift.hnagłówek został wygenerowany automatycznie. Pamiętaj, że możesz zmienić wiele ostrzeżeń o wycofaniu, gdy zmienisz docelową wersję wdrożenia, szczególnie gdy masz starszą i bardzo dużą bazę kodu Celu C. W naszym przypadku mieliśmy również dużo pracy w plikach XIB i klasach przeglądania.

Rafael Bugajewski
źródło
2
Dla innych - poszukaj w Ustawieniach kompilacji swojego celu, uzyskaj dokładną nazwę „MyProject-Swift.h” - to właśnie musisz uwzględnić jako „#include” MyProject-Swift.h ”w odpowiednich plikach Objc. BTW, to odpowiedź naprawdę mi pomogła - pracowałem nad konwersją starszego open source Objective C.
David H.
0

Jeśli wcześniej byłeś w stanie zbudować projekt, bez problemów związanych z “ProductModuleName-Swift.h” not foundbłędami, a teraz znów otrzymujesz te nieprzyjemne błędy, przyczyną mogą być ostatnie zmiany.

Dla mnie było to (przypadkowe) nieprawidłowe .swift kodowanie pliku. Cofanie zmian i przywracanie ręczne wykonuje zadanie.

Jewhen Dubinin
źródło
0

To może być oczywisty punkt (może zbyt oczywisty), ale musisz mieć co najmniej jeden szybki plik w projekcie, aby nagłówek mógł zostać wygenerowany. Jeśli piszesz załącznik lub kod konfiguracji z zamiarem szybkiego pisania później, import nie będzie działać.

Alex Brown
źródło
0

Musiałem usunąć szybki kod WatchOS2 z mojego projektu Celu C. I dopiero potem XCode zaproponował wygenerowanie -Swift.h

Andrew Marin
źródło
0

Miałem podobny problem, ale mój projekt kompilował się wcześniej i nagle pojawił się błąd po kilku zmianach kodu pliku. Dowiedziałem się, dlaczego pojawia się błąd „Nie znaleziono pliku” dla pliku myproject-swift.h. Wprowadzone przeze mnie zmiany w kodzie miały pewne błędy. Xcode nie wskazał, że zamiast tego cały czas wyświetlał błąd, pokazując „Błąd pliku nie znaleziono”. Potem dostałem kopię poprzedniego kodu i porównałem go z nowym kodem i scaliłem jeden po drugim. Po każdym scaleniu plików projekt był zgodny z projektem, aby znaleźć błąd. Więc jeśli chodzi o błąd w kodzie, Xcode może po prostu wyświetlać „błąd pliku nie znaleziono” dla pliku myproject-swift.h. Najprawdopodobniej masz błąd kompilacji w swoim projekcie. Wyczyść te błędy i będzie działać.

Ram G.
źródło
0

Jeśli używasz czegoś takiego jak Cocoapods (i pracujesz poza obszarem roboczym zamiast projektu), spróbuj otworzyć projekt i zbudować go przed otwarciem obszaru roboczego i budynku. YMMV.

Warpling
źródło
0

Czasami wystarczy rozbroić, a następnie ponownie ustawić docelowe członkostwo w pliku obj-c .m.

valeCocoa
źródło