Importowanie pliku Project-Swift.h do klasy Objective-C… nie znaleziono pliku

128

Mam projekt, który został uruchomiony w Objective-C i próbuję zaimportować jakiś kod Swift do tych samych plików klas, w których wcześniej napisałem Objective-C.

Skonsultowałem się z dokumentacją Apple dotyczącą używania Swift i Objective-C w tym samym projekcie, a także pytania SO takie jak to, ale nadal bezskutecznie: nadal otrzymuję błąd `` nie znaleziono pliku '' po wprowadzeniu #import "NewTestApp-Swift.h"( NewTestAppjest to nazwa produktu i moduł).

Oto, co zrobiłem do tej pory:

  1. W Define Modules, wybrane YESdla aplikacji.
  2. Upewniono się, że nazwa modułu produktu nie zawiera żadnego miejsca (patrz zrzut ekranu poniżej pytania)

Próbowałem za pomocą #import "NewTestApp-Swift.h"wnętrza ViewController.m, ViewController.ha AppDelegate.mjednak żaden z nich nie pracował.

Co jeszcze robię nieprawidłowo? Dzięki za pomoc.


Zrzut ekranu ustawień:

wprowadź opis obrazu tutaj


Błędy, które obecnie napotykam:

wprowadź opis obrazu tutaj

daspianista
źródło
3
Usunięcie wszystkich danych pochodnych w ~/Library/Developer/Xcode/DerivedDatarozwiązaniu problemu.
wzhang84
Oto jak rozwiązałem ten problem: stackoverflow.com/a/45338549/8102549
schrulnz

Odpowiedzi:

158

Miałem ten sam problem i nie mogłem zmusić mojego projektu do zaimportowania swift do klas obj-c. Używając Xcode 6 (powinno działać dla Xcode 6+) i mogłem to zrobić w ten sposób ....

  1. Każda klasa, do której chcesz uzyskać dostęp w pliku .h, musi być deklaracją do przodu, taką jak ta

@class MySwiftClass;

  1. TYLKO w pliku .m, jeśli kod znajduje się w tym samym projekcie (module), musisz go zaimportować z

#import "ProductModuleName-Swift.h"

Link do dokumentacji Apple na ten temat

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c

bolnad
źródło
3
Dziękuję za odpowiedź. To poprowadziło mnie we właściwym kierunku. Miałem ten sam problem, ale z protokołem, więc musiałem dodać @protocol MySwiftProtocol zamiast importu w moim pliku nagłówkowym.
palma
w pliku .h przekazanie deklaracji klasy bez importowania pliku .h załatwiło sprawę. Dzięki
Sikander
1
Zwróć uwagę, że jeśli nazwa produktu zawiera -znak, nazwa wygenerowanego pliku nagłówkowego zostanie przekonwertowana na _. np. jeśli nazwa twojego produktu to My-App, to importujesz My_App-Swift.h.
dvanoni
1
Znalazłem nowy sposób na znalezienie poprawnej nazwy wygenerowanego pliku nagłówka: przejdź do celu -> Ustawienia kompilacji -> Słowa kluczowe wyszukiwaniaObjective-C Generated Interface Header Name , bingo!
Itachi,
2
Zrobiłem obie te rzeczy i nadal widzę ten sam problem. Myślisz, że ma to związek z zamówieniem?
ArielSD
83

Jeśli kod Swift znajduje się wewnątrz modułu (jak w twoim przypadku):

#import <ProductName/ProductModuleName-Swift.h>

Jeśli kod Swift znajduje się wewnątrz projektu (mieszany Swift i ObjC):

#import <ProductModuleName-Swift.h>

W twoim przypadku musisz dodać ten wiersz w pliku * .m:

#import <NewTestApp/NewTestApp-Swift.h>

WAŻNE: spójrz na „<” w instrukcji importu

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

ikocel1
źródło
Dzięki za odpowiedź @ ikocel1. Niestety te nie działały. Próbowałem odmiany <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>a <NewTestApp/ViewController-Swift.h>wszystko w środku ViewController.m, ale w dalszym ciągu, aby uzyskać „file not found” błąd, pomimo Cleaningprojektu za każdym razem po próbie połączenia. W treści pytania zamieściłem zrzut ekranu na wypadek, gdyby to pomogło.
daspianist
Nie wprowadziłem jeszcze żadnego kodu Swift w ViewController.m. Próbowałem tylko zaimportować najpierw nagłówki, aby spróbować zaakceptować kod Swift. Będę mieszać i dopasowywać zarówno kod Objective-C, jak i Swift w ViewController.m.
daspianist
1
Nie wiem, czy możliwe jest bezpośrednie mieszanie kodu objc i kodu swift w tym samym pliku.
ikocel1
1
Dzięki, wydaje mi się, że to było założenie, które oparłem na dokumencie „Mix and Match” firmy Apple… ale nie w samym pliku. Dziękuję Ci!
daspianist
6
Nie rozumiem, dlaczego ta odpowiedź została zatwierdzona. Tak, jest to zgodne z dokumentacją, ale u mnie praktycznie też nie działa. Nawet w pytaniu jest oczywiste, że użytkownik używa składni, tak jak jest to zalecane w tej odpowiedzi, ale nadal otrzymuje błąd.
Darius Miliauskas
54

Jak udało mi się zaimportować Swift do Objective-c:

  • Definiuje moduł ustawiony na TAK (w projekcie - nie w celu)
  • Nazwa modułu produktu została ustawiona (docelowo - nie w projekcie)
  • W swoim ViewController.m zaimportuj szybki kod za pomocą:

    #import "MyProductModuleName-Swift.h"
  • Dodaj plik Swift do projektu goal-c (File -> New -> Swift), a Xcode utworzy nagłówek mostkujący z objective-c do Swift, ale jest to kluczowe, aby działał również w drugą stronę - najwyraźniej.

Za ostatni element tej układanki dziękuję Swiftoverload za uświadomienie mi, że faktycznie dodaję plik Swift za pośrednictwem interfejsu GUI Xcode, a nie tylko przeciągając i upuszczając istniejące pliki Swift do mojego projektu, aby działał: http://nikolakirev.com/blog / using-swift-in-goal-c-project

holm50
źródło
Doskonałe notatki. Dodałbym, że celem testu jest własny moduł i będzie miał swój własny nagłówek o nazwie „<#TestTargetName #> - Swift.h” oraz że wszelkie spacje w nazwach docelowych zostaną zamienione na spacje.
Chuck Krutsinger
@ holm51 przepraszam, że pytam, ale gdzie jest Define Modulei Product Module Name?
matchifang
kreski -w imieniu zostaną przekształcone do podkreślenia _, jak również
CyberMew
11

Używając Xcode 8.2.1 i jeśli spojrzysz na Projekt > Ustawienia kompilacji> Nazwa nagłówka wygenerowanego interfejsu Objective-C , pokazuje tylko jeden plik nagłówkowy o nazwie Product -Swift.h

Oznacza to, że zamiast importować każdy moduł oddzielnie z pliku Objective-C .m, używając pojedynczego pliku -Swift.h, wystarczy zaimportować jeden produkt -Swift.h, który agreguje wszystkie moduły Swift.

Napotkałem ten sam problem, szukając tradycyjnego sposobu importowania modułów osobno, ale obecna wersja Xcode i Swift 3 zmieniła go tak, aby używał tylko jednego nagłówka do importowania wszystkich modułów.

petershine
źródło
cześć peter, gdzie możesz znaleźć ten plik? Czy jest generowany automatycznie przez xcode? Czy z powodu tej zmiany musisz inaczej skonfigurować plik podfile?
Rob Norback
@RobNorback Jeśli się nie mylę, możesz po prostu napisać 'import "Product-Swift.h" w nagłówku / pliku implementacji Obj-C, aby zobaczyć efekt, bez robienia nic więcej. Upewnij się, że ustawienia projektu mają włączoną każdą konfigurację dla mieszania Swift i Obj-C. Nadal nie wystąpił problem z Podfile. Daj mi znać, jeśli widzę rzeczy inaczej.
petershine
Dziękuję, spędziłem godziny na próbach debugowania tego, a problem rzeczywiście polegał na tym, że każdy z modułów w moim projekcie generował swój własny -Swift.hplik nagłówkowy. Zmuszenie ich wszystkich (mam 5 celów) do używania wspólnego pliku nagłówkowego rozwiązało problem.
Apoorv Khatreja
@ApoorvKhatreja jak ich do tego zmusiłeś? Czy jawnie napisałeś nazwę pliku?
Amit Raz,
8

Spędziłem godzinę nad tym problemem, wykonując następujące kroki, aby zrozumieć, czego brakuje:

  1. Otwórz preferencję Xcode i przejdź do folderu DerivedData
  2. Wyszukaj „swift.h” w wyszukiwarce
  3. Jeśli nie możesz znaleźć żadnego pliku projektu swift.h, oznacza to, że ten plik nie został wygenerowany. Zwykle musisz dodać @objc do jednej ze swoich klas Swift i pomyślnie skompilować aplikację, tylko wtedy Xcode wygeneruje ten plik
  4. Jeśli znalazłeś plik „xxx-swift.h”, upewnij się, że instrukcja importu zawiera poprawną nazwę.

jak-zlokalizować-plik-swift

Jakehao
źródło
Nie dodawaj tej samej odpowiedzi do wielu pytań . Odpowiedz na najlepszy, a resztę oznacz jako duplikaty, gdy zdobędziesz wystarczającą reputację. Jeśli to nie jest duplikat, dostosuj post do pytania i zaznacz, aby można było go cofnąć.
Bhargav Rao
Dziękuję Ci za to! Zmieniłem nazwę wyświetlania mojej aplikacji (nie celu), a nagłówek Swift również zmienił nazwę. Tylko w ten sposób mogłem dowiedzieć się, co się dzieje.
Lucas P.
Dziękuję za wysłanie odpowiedzi. Zrzuty ekranu i precyzyjny formularz punktowy natychmiast sprawiają, że przewijam wstecz + wyglądam + kończyłam wyszukiwanie ... problem rozwiązany!
dklt
6

Miałem problemy z importowaniem Swifta do projektu Objective-C. W końcu zajrzałem do folderu Derivied Data, aby sprawdzić, co generuje Xcode 7. Nazwa pliku była zupełnie inna niż ta, której się spodziewałem.

Gdy już miałem rzeczywistą nazwę pliku, zaimportowałem to i projekt mógł zostać zbudowany.

Josh B.
źródło
2
Gdzie znajduje się ten plik? Rozejrzałem się tam i nic nie mogłem znaleźć
Amit Raz
5

-Swift.hpowinien zostać utworzony automatycznie przez Xcode, jeśli kod Swift ujawnia interfejs API za pośrednictwem @objclub @objcMembers[Informacje]

Zwykle wygląda jak lokalizacja

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Można to zmienić

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

Domyślna wartość to $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

yoAlex5
źródło
2

DEFINIUJ MODUŁY: TAK i zaimportuj „ProjectName-Swift.h” do pliku .m klasy Obj-C

Pomogło mi to uzyskać dostęp do klas Swift w Obj-c.

Wentylator YSR
źródło
3
Ale jak zaimportować go do pliku .h, jeśli potrzebuję klasy Swift w nagłówku objc?
Alexander Danilov,
1

Miałem ten sam problem z moim zespołem, gdy pracowałem nad projektem przy użyciu git. Jeden programista nie zaktualizował Xcode do ostatniej wersji (7.3), która była wymagana dla najnowszej wersji Swift 2.2. Dlatego kompilator nie rozpoznał nowej składni języka Swift i nie mógł wygenerować interfejsu dla biblioteki Swift (nazwa projektu-swift.h). Sprawdź, czy wersja Xcode jest najnowsza!

Artem Loginov
źródło
W moim przypadku napotkałem problem, ponieważ zdecydowałem się odłożyć migrację do Swift 3 oferowanego przez Xcode. W rezultacie Xcode nie był w stanie zbudować plików źródłowych Swift i nie wygenerował nagłówków do uwzględnienia.
iutinvg
1

Podczas programowania może istnieć możliwość, że będziesz mieć dowolną klasę swift, która nie została w pełni zaimplementowana, co może spowodować błędy składniowe. Plik nagłówkowy Swift będzie dostępny do użytku tylko wtedy, gdy wszystkie pliki Swift są wolne od błędów.

Upewnij się, że w plikach Swift nie ma błędów składniowych, a następnie spróbuj zaimportować nagłówek Swift w pliku celu - c

Gurunath Sripad
źródło
1

Importowanie pliku nagłówkowego, tj

#import "<ProjectName>-Swift.h" 

w pliku .h wygenerował błąd informujący:

Nie znaleziono pliku -Swift.h ”

i budowa się nie powiodła.

Zamiast tego użyj:

#import "<ProjectName>-Swift.h"

w pliku .m i nawet jeśli pojawia się ten sam błąd, uruchomienie projektu i tak pomija błąd.

Klasy Swift są następnie dostępne w pliku .m.

Claytog
źródło
1

Miałem problem z nazwą projektu (celu). Zawierał symbol „-”. Więc decyzja była następna: jeśli nazwa projektu to „Test-App”, to nazwa importowanej klasy to „Test_App-Swift.h”

opochtovy
źródło
rewelacyjne rozwiązanie
iOS Lifee
1

Jeśli nazwa Twojej aplikacji ma jakikolwiek znak specjalny, użyj znaku _ jako znaku specjalnego.

Na przykład, jeśli nazwa Twojej aplikacji to Nazwa „Aplikacja testowa®”

Następnie możesz zaimportować plik Swift przez „Test_App_-Swift.h”.

Spacje i ® są zastępowane przez _ podczas importowania.

Technologia Silversky
źródło
0

Jeśli masz wiele obiektów docelowych, upewnij się, że masz skompilowane wszystkie platformy

Same7Farouk
źródło
0

Xcode 11

Napotkałem ten problem podczas tworzenia na Xcode 11. Trochę mi zajęło ustalenie, co jest nie tak, ale zasadniczo zmieniłem ustawienie „Nazwa wyświetlana” na karcie „Ogólne” elementu docelowego zamiast zmieniać bezpośrednio w Info.plistpliku za pomocą Zakładka „Informacje” w Celu.

Spowodowało to, że Xcode 11.5 przeszedł przez przepisywanie / tworzenie zestawu zupełnie nowych niestandardowych ustawień kompilacji i modyfikację nazwy modułu aplikacji i wbudowanego produktu .app. W tym przypadku nowa nazwa wyświetlacz miał również ukośnik ( /) znak w nim, które mogą ostatecznie być, dlaczego nie było budynku (patrz @Silversky Technologia „s odpowiedź ).

Niezależnie od tego rozwiązałem ten problem, cofając wszystkie automatyczne zmiany Xcode 11.5 w pliku projektu i ręcznie wprowadzając tę ​​samą zmianę w nazwie wyświetlanej pakietu w Info.plistpliku i wszystko działa idealnie.

Chciałbym, żeby ci powiedział, że robił takie rzeczy, zanim to się zaczęło i robi to bez twojej zgody.

Beltalowda
źródło
0

Upewnij się, że twoja klasa swift ma publiczną deklarację i rozszerza NSObject:

public class MySwiftClass: NSObject {
    //...
}

Import powinien działać z cudzysłowami, a nie nawiasami, jeśli klasa swift znajduje się w tym samym projekcie.

Michael Ribbons
źródło
0

jeśli najpierw dodasz plik Swift, pamiętaj, aby dodać plik Swift do celu ... w lewej kolumnie

JethroYe
źródło