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"
( NewTestApp
jest to nazwa produktu i moduł).
Oto, co zrobiłem do tej pory:
- W
Define Modules
, wybraneYES
dla aplikacji. - 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.h
a AppDelegate.m
jednak żaden z nich nie pracował.
Co jeszcze robię nieprawidłowo? Dzięki za pomoc.
Zrzut ekranu ustawień:
Błędy, które obecnie napotykam:
~/Library/Developer/Xcode/DerivedData
rozwiązaniu problemu.Odpowiedzi:
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 ....
@class MySwiftClass;
#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
źródło
-
znak, nazwa wygenerowanego pliku nagłówkowego zostanie przekonwertowana na_
. np. jeśli nazwa twojego produktu toMy-App
, to importujeszMy_App-Swift.h
.Objective-C Generated Interface Header Name
, bingo!Jeśli kod Swift znajduje się wewnątrz modułu (jak w twoim przypadku):
Jeśli kod Swift znajduje się wewnątrz projektu (mieszany Swift i ObjC):
W twoim przypadku musisz dodać ten wiersz w pliku * .m:
WAŻNE: spójrz na „<” w instrukcji importu
https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
źródło
<NewTestApp-Swift/NewTestApp-Swift.h>
,<NewTestApp/NewTestApp-Swift.h>
a<NewTestApp/ViewController-Swift.h>
wszystko w środkuViewController.m
, ale w dalszym ciągu, aby uzyskać „file not found” błąd, pomimoCleaning
projektu za każdym razem po próbie połączenia. W treści pytania zamieściłem zrzut ekranu na wypadek, gdyby to pomogło.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 wViewController.m
.Jak udało mi się zaimportować Swift do Objective-c:
W swoim ViewController.m zaimportuj szybki kod za pomocą:
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
źródło
Define Module
iProduct Module Name
?-
w imieniu zostaną przekształcone do podkreślenia_
, jak również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.
źródło
-Swift.h
plik nagłówkowy. Zmuszenie ich wszystkich (mam 5 celów) do używania wspólnego pliku nagłówkowego rozwiązało problem.Spędziłem godzinę nad tym problemem, wykonując następujące kroki, aby zrozumieć, czego brakuje:
źródło
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.
źródło
-Swift.h
powinien zostać utworzony automatycznie przez Xcode, jeśli kod Swift ujawnia interfejs API za pośrednictwem@objc
lub@objcMembers
[Informacje]Zwykle wygląda jak lokalizacja
Można to zmienić
Domyślna wartość to
$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
źródło
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.
źródło
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!
źródło
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
źródło
Importowanie pliku nagłówkowego, tj
w pliku .h wygenerował błąd informujący:
i budowa się nie powiodła.
Zamiast tego użyj:
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.
źródło
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”
źródło
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.
źródło
Jeśli masz wiele obiektów docelowych, upewnij się, że masz skompilowane wszystkie platformy
źródło
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.plist
pliku 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.plist
pliku 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.
źródło
Upewnij się, że twoja klasa swift ma publiczną deklarację i rozszerza NSObject:
Import powinien działać z cudzysłowami, a nie nawiasami, jeśli klasa swift znajduje się w tym samym projekcie.
źródło
jeśli najpierw dodasz plik Swift, pamiętaj, aby dodać plik Swift do celu ... w lewej kolumnie
źródło