Próbuję zintegrować Swift
kod z moją aplikacją, moja aplikacja jest napisana Objective-C
i dodałem Swift
klasę. Zrobiłem wszystko, co tu opisano . Ale moim problemem jest to, Xcode
że nie utworzyłem -Swift.h
pliku, a jedynie nagłówki łączące. Więc go stworzyłem, ale tak naprawdę jest pusty. Mogę używać wszystkich moich klas ObjC w Swift, ale nie mogę tego zrobić na odwrót. Zaznaczyłem moją szybką klasę, @objc
ale to nie pomogło. Co mogę teraz zrobić?
EDYCJA: Apple mówi: „Kiedy importujesz kod Swift do Celu-C, polegasz na Xcode-generated
pliku nagłówkowym, aby udostępnić te pliki Celowi-C. [...] Nazwą tego nagłówka jest nazwa modułu produktu, a następnie dodanie„ -Swift.h ”.”
Teraz, gdy chcę zaimportować ten plik, pojawia się błąd:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Oto mój plik FBManager.swift:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
źródło
YourProjectName-Swift.h
powinien być magicznym plikiem nagłówkowym, który Xcode automatycznie tworzy dla ciebie podczas kompilacji (tak naprawdę nie zobaczysz go w przeglądarce projektu). Spróbuj usunąć utworzony i dodaj#import YourProjectName-Swift.h
do plików, w których chcesz użyć klas Swift.myProjectModule
?-Swift.h
Plik powinien zaczynać się od nazwy aplikacji. Czy masz plik z rozszerzeniem-Bridging-Header.h
? Powinieneś. Jeśli tak, pierwszą częścią tego pliku jest nazwa twojego projektu. Połącz pierwszą część tej nazwy pliku z-Swift.h
tym, co powinieneś dołączyć.-Swift.h
na moim komputerze Mac nie ma żadnego rzeczywistego pliku , który mógłbym znaleźć, a jednak mogę go dołączyć. Więc nie rozłączaj się, szukając takiego pliku. Upewnij się tylko, że nazywasz go poprawnie.#import <MyProjectName/MyProjectName-Swift.h>
Odpowiedzi:
Spędziłem około 4 godzin próbując włączyć
Swift
w moimXcode
projekcie opartym na Objective-C. Mójmyproject-Swift.h
plik został pomyślnie utworzony, ale mójXcode
go nie widziałSwift-classes
. Postanowiłem więc stworzyć nowyXcode
projekt oparty na Objc i wreszcie znalazłem właściwą odpowiedź! Mam nadzieję, że ten post pomoże komuś :-)Krok po kroku Szybka integracja dla projektu opartego na Xcode Objc:
*.swift
plik (w Xcode) lub dodaj go za pomocą Findera.Objective-C bridging header
gdy Xcode zapyta cię o to.Zaimplementuj swoją klasę Swift:
Otwórz Ustawienia kompilacji i sprawdź następujące parametry:
YES
myproject
YES
myproject-Swift.h
$(SRCROOT)/myproject-Bridging-Header.h
Zaimportuj nagłówek interfejsu Swift do pliku * .m.
źródło
"myproject-Swift.h"
więc wydaje mi się, że nie działa. Najwyraźniej ten plik nie jest widoczny w nawigatorze projektu.#import "myproject-Swift.h"
.Nie twórz samodzielnie pliku nagłówka. Usuń ten, który utworzyłeś.
Upewnij się, że twoje klasy Swift są oznaczone
@objc
lub dziedziczą po klasie, która wywodzi się (bezpośrednio lub pośrednio)NSObject
.Xcode nie wygeneruje pliku, jeśli masz jakieś błędy kompilatora w swoim projekcie - upewnij się, że projekt buduje się poprawnie.
źródło
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u
aby sprawdzić, czy plik został utworzony z nieoczekiwaną nazwą, jak dla mnie. :)Pozwól Xcode wykonać swoją pracę, nie dodawaj / nie twórz ręcznie nagłówka Swift. Wystarczy dodać @objc przed klasą Swift ex.
W ustawieniach projektu wyszukaj poniższe flagi i zmień je na TAK (zarówno Projekt, jak i Cel)
Następnie wyczyść projekt i skompiluj raz, po pomyślnej kompilacji (prawdopodobnie powinno) zaimportuj poniżej pliku nagłówka do pliku .m klasy Goal-c
Boooom!
źródło
Basic
sięAll
w górnym pasku.Embedded Content Contains Swift
został zmieniony naAlways Embed Swift Standard Libraries
Xcode 8: stackoverflow.com/questions/38792650/…Prawdopodobnie pomocne również dla tych z was, którzy mają cel Framework :
Instrukcja importu automatycznie generowanego pliku nagłówkowego wygląda nieco inaczej niż cele aplikacji. Oprócz innych rzeczy wymienionych w innych odpowiedziach użyj
zamiast
zgodnie z dokumentacją Apple na temat Mix & Match dla celów ramowych.
źródło
Upewnij się, że Twój projekt definiuje moduł i że nadałeś mu nazwę. Następnie przebuduj, a Xcode utworzy
-Swift.h
plik nagłówka i będziesz mógł zaimportować.Możesz ustawić definicję i nazwę modułu w ustawieniach projektu.
źródło
Szczegóły: Projekt Objective-C z kodem Swift 3 w Xcode 8.1
Zadania:
PEŁNA PRÓBKA
1. Klasa Objective-C, która wykorzystuje szybkie wyliczanie
Wykryj kod Swift w kodzie Objective-C
W mojej próbce używam SwiftCode.h do wykrycia kodu Swift w Objective-C. Ten plik generuje się automatycznie (nie utworzyłem fizycznej kopii tego pliku nagłówka w projekcie) i możesz ustawić tylko nazwę tego pliku:
2. Szybka klasa wykorzystująca wyliczenie celu C
Wykryj kod celu C w kodzie Swift
Musisz utworzyć mostkowy plik nagłówkowy. Gdy dodasz plik Swift w projekcie Objective-C lub plik Objective-C w swift projektu, Xcode zasugeruje utworzenie nagłówka pomostowego.
Tutaj możesz zmienić nazwę pliku nagłówka pomostowego:
Stosowanie
Wynik
WIĘCEJ PRÓBEK
3. Wywołaj klasę Swift z kodu Celu-c
Wynik
4. Wywołaj klasę Objective-c z kodu Swift
Wynik
5. Użyj rozszerzenia Swift w kodzie Objective-c
6. Użyj rozszerzenia Objective-c w szybkim kodzie
źródło
@objcMembers
przed klasą. Ponieważ@objc
wnioskowanie zostało zmniejszone w Swift 4 w celu optymalizacji. Na przykład właściwość w klasie pochodnej NSObject nie będzie już domyślnie wnioskować o @objc (tak jak w Swift 3). Mam informacje z tej odpowiedzi .Miałem ten sam problem i okazało się, że specjalne symbole w nazwie modułu zostały zastąpione przez xcode (w moim przypadku kreski zakończyły się podkreśleniem). W ustawieniach projektu zaznacz „nazwa modułu”, aby znaleźć nazwę modułu dla swojego projektu. Następnie użyj
ModuleName-Swift.h
lub zmień nazwę modułu w ustawieniach.źródło
Plik jest tworzony automatycznie (tutaj mowa o Xcode 6.3.2). Ale go nie zobaczysz, ponieważ znajduje się w folderze danych pochodnych. Po oznaczeniu swojej szybkiej klasy za pomocą
@objc
, skompiluj, a następnie wyszukajSwift.h
w folderze Dane pochodne. Powinieneś tam znaleźć nagłówek Swift.Miałem problem, że Xcode przemianował mój
my-Project-Swift.h
namy_Project-Swift.h
Xcode, nie lubi"." "-"
symboli itp. Za pomocą powyższej metody możesz znaleźć nazwę pliku i zaimportować go do klasy Objective-C.źródło
#import "my_project-Swift.h"
a faktyczna nazwa mojego projektu tomy-project
Wystarczy dołączyć #import „myProject-Swift.h” do pliku .m lub .h
PS Nie znajdziesz „myProject-Swift.h” w inspektorze plików, jest on ukryty. Ale jest generowany automatycznie przez aplikację.
źródło
Odpowiedź @ sig jest jedną z najlepszych, jednak nie działała dla mnie ze starym projektem (nie nowym!), potrzebowałem modyfikacji. Po wielu odmianach znalazłem dla mnie przepis (używając XCode 7.2):
Ostatni punkt (5) był kluczowy. Umieściłem go tylko w drugiej sekcji (pole Cele), pole projektu powinno pozostać puste: w przeciwnym razie nie wygenerowałoby dla mnie odpowiedniego pliku „Project-Swift.h” (nie zawierało szybkich metod).
źródło
Define Modules
powinno byćNo
??Są dwa warunki
W tym celu musisz wykonać następujące kroki:
Przejdź do Ustawień kompilacji i wykonaj poniższe kroki z wyszukiwaniem,
Następnie wyczyść i odbuduj swój projekt.
Użyj pliku szybkiego w pliku celu c.
W takim przypadku najpierw napisz „@objc” przed klasą w szybkim pliku.
Następnie w pliku celu c napisz to,
Użyj pliku celu c w pliku szybkim.
W takim przypadku w pliku nagłówkowym napisz to,
Mam nadzieję, że to Ci pomoże.
źródło
W przypadku Swift 5:
@objc
słowo kluczowe do swojej klasy i metodpublic
słowo kluczowe do swojej klasy i metodNSObject
Umieść
#import "MyProject-Swift.h"
plik Objective-Cźródło
W moim przypadku oprócz tych kroków:
Musiałem ustawić klasę jako publiczną , aby utworzyć plik productName-Swift.h :
źródło
Właśnie odkryłem, że dodanie katalogu szybkich plików do projektu nie zadziała. Najpierw musisz utworzyć grupę dla katalogu, a następnie dodać szybkie pliki ...
źródło
Miałem ten sam problem i ostatecznie okazało się, że nie byli przywiązani do tych samych celów. Klasa ObjC jest dołączona do Target1 i Target2, klasa Swift jest dołączona tylko do Target1 i nie jest widoczna w klasie ObjC.
Mam nadzieję, że to komuś pomoże.
źródło
mój problem polegał na tym, że utknąłem po utworzeniu pliku pomostu przez xcode, ale nadal mam błąd w nazwie pliku nagłówka MYPROJECTNAME-swift.h
1. Sprawdzam w terminalu i szukam wszystkich automatycznie utworzonych plików szybkiego mostu:
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
widzisz, co stworzył xcode.
źródło
Gdy dodajesz nowe pliki Swift do projektu, pamiętaj, aby dodać je do poprawnych celów. Upewnij się, że każdy szybki plik, którego będziesz używać, dziedziczy klasę NSObject i jest opatrzony adnotacją @ObjCMembers Zmień na TAK w ustawieniach kompilacji w opcji ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Zmień na TAK w ustawieniach kompilacji w opcji DEFINES_MODULE.
źródło
Mam ten sam błąd:
myProjectModule-Swift.h
nie znaleziono pliku „, ale w moim przypadku przyczyną był niewłaściwy cel instalacji:”Swift
jest niedostępny w systemie OS X wcześniejszym niż 10.9; ustawMACOSX_DEPLOYMENT_TARGET
na 10.9 lub nowszy (obecnie jest to „10.7”) ”, więc kiedy zmieniłem cel wdrożenia na 10.9 - projekt został pomyślnie skompilowany.źródło
Mój problem polegał na tym, że automatyczne generowanie pliku -swift.h nie było w stanie zrozumieć podklasy CustomDebugStringConvertible. Zamiast tego zmieniłem klasę na podklasę NSObject. Następnie plik -swift.h poprawnie zawierał klasę.
źródło
Miałem problemy polegające na tym, że dodawałem klasy do mojego nagłówka pomostowego celu-c, aw importowanych nagłówkach celu-c próbowano zaimportować szybki nagłówek. Nie podobało mi się to.
Tak więc we wszystkich moich klasach-c, które używają szybkich, ale również zmostkowanych, kluczem było upewnienie się, że używasz deklaracji klas do przodu w nagłówkach, a następnie importujesz plik „* -Swift.h” do pliku .m.
źródło
Nie musiałem zmieniać żadnych ustawień w kompilacji ani dodawać @obj do klasy.
Wszystko, co musiałem zrobić, to utworzyć nagłówek mostu, który byłby automatycznie tworzony, kiedy tworzyłem klasy Swift w projekcie Objective-c. A potem musiałem to zrobić
import „Bedtime-Swift.h” <- wewnątrz pliku celu-c, który musiał użyć tego szybkiego pliku.
źródło
cóż, po przeczytaniu wszystkich komentarzy i ponownym przeczytaniu i ponownym spróbowaniu udało mi się włączyć szybkie klasy do mojego projektu Big obj-c. Dzięki za wszelką pomoc. Chciałem podzielić się jedną wskazówką, która pomogła mi lepiej zrozumieć ten proces. W klasie .m udałem się do linii importu szybkiej nazwy docelowej #import „myTargetName-Swift.h” i kliknąłem klawisz:
polecenie + kliknięcie myszą -> Przejdź do definicji
Tam możesz zobaczyć całe tłumaczenie z swift na obj-c, a znajdziesz różne funkcje zadeklarowane w obj-c. Mam nadzieję, że ta wskazówka pomoże ci tak bardzo, jak pomogła mi.
źródło
Używanie szybkich klas w celu C
Jeśli zamierzasz zaimportować kod w ramach celu aplikacji (mieszanie Objective-C i Swift w jednym projekcie), powinieneś użyć następnego wiersza importu,
#import "<#YourProjectName#>-Swift.h"
aby udostępnić kod Swift do kodu Objective-C [Mieszanie Swift i Objective-C w projekcie]W tym poście opiszę, jak zaimportować statyczną bibliotekę Swift do kodu Objective-C
Cel C konsument -> Szybka biblioteka statyczna
Wersja Xcode 10.2.1
Utwórz szybką bibliotekę statyczną
Śledź
Create Swift static library
kolejne dodatki:Ujawnij Swift API. Aby korzystać z funkcji Swift z Objective-C [Informacje]
Po zbudowaniu powinieneś znaleźć
<product_name>-Swift.h
plik, który powinien znajdować się wDerivedSources
[Nie znaleziono pliku]Konsument C celu z biblioteką statyczną Swift
Drag and drop
plik binarny do projektu Xcode [Informacje]Link Library
[Niezdefiniowane symbole] [Link vs Osadź]Dodaj
Library Search paths
[Nie znaleziono biblioteki dla] [Ścieżka rekurencyjna]Dodaj
Header Search Paths
[Nie znaleziono modułu] [Ścieżka rekurencyjna]Dodaj puste
.swift file
do projektu Objective-C. [Niezdefiniowane symbole] Gdy zapytasz Xcode, naciśnij UtwórzBridging Header
(utworzymodule_name-Bridging-Header.h
) i ustaw ścieżkę do tego plikuZaimportuj moduł do kodu klienta Objective-C [Nie znaleziono pliku] [nazwa_modułu]
Więcej przykładów tutaj
źródło
XCode 11.3.1:
Kiedy chcę użyć wewnętrznej klasy Swift w kodzie objc, nie kompiluje się pod kątem błędu „niezdefiniowany symbol” (dla innej klasy wewnętrznej i zewnętrznej), sprawdziłem wygenerowany nagłówek „-swift.h” i obie klasy są tam.Po wielu godzinach próbuję przekształcić klasę wewnętrzną w normalną i kompiluje się.Oczyszczam projekt, usuwam folder DerivedData i się kompiluje.
źródło
@objc
przed deklaracją klasy wewnętrznej?Po wykonaniu wszystkich powyższych czynności nadal mam błędy. Mój problem polegał na tym, że pliki Swift, których potrzebowałem, nie zostały z jakiegoś powodu dodane do zasobów pakietu.
Naprawiłem to, przechodząc do [MyTarget]> Fazy kompilacji> Kopiuj zasoby pakietu, a następnie kliknąłem przycisk plus i dodałem pliki Swift.
źródło