Jak mogę zaimportować kod Swift do Objective-C?


281

Napisałem bibliotekę w Swift i nie byłem w stanie zaimportować jej do mojego obecnego projektu, napisanego w Objective-C.

Czy są jakieś sposoby na jego zaimportowanie?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
uwielbiam ten projekt!
SleepsOnNewspapers

Odpowiedzi:


430

Musisz zaimportować TargetName-Swift.h. Zauważ, że jest to nazwa docelowa - inne odpowiedzi popełniają błąd przy użyciu nazwy klasy.

Ten pojedynczy plik jest automatycznie generowanym nagłówkiem, który definiuje interfejsy Objective-C dla wszystkich klas Swift w twoim projekcie, które są opatrzone adnotacjami @objclub dziedziczą NSObject.

Uwagi:

  • Jeśli nazwa docelowa zawiera spacje, zamień je na podkreślenia (np. My ProjectStaje się My_Project-Swift.h)

  • Jeśli Twoim celem jest struktura, musisz zaimportować <TargetName/TargetName-Swift.h>

  • Upewnij się, że plik Swift jest członkiem elementu docelowego


5
Pamiętaj, że jeśli spróbujesz użyć nazwy pliku Swift w imporcie, pojawi się błąd „Oczekiwany”; „ po deklaratorze najwyższego poziomu ". w pliku Swift po „importowaniu Foundation”.
louielouie

8
EDYCJA: Uwaga: aby to zadziałało, MUSI zostać zdefiniowana nazwa modułu projektu. Zobacz: stackoverflow.com/a/24064015/2085743
Ruben Martinez Jr.

7
Chciałbym tylko dodać notatkę, że jeśli nazwa twojego projektu ma białe znaki lub znaki specjalne, musisz je zastąpić podkreśleniami, np. „Moja aplikacja” to „My_App-Swift.h”
Hola Soy Edu Feliz Navidad

84
Dlaczego jest to tak trudne i źle udokumentowane?
uchuugaka,

3
@ lelelo Nie, ten plik jest przeciwieństwem tego. Nagłówek mostkujący został napisany przez programistę i pozwala wprowadzić symbole Objective-C i C do kodu Swift. Plik Target-Swift.h jest generowany automatycznie i umożliwia Twojemu kodowi Objective-C / C dostęp do symboli Swift.
Bill

154

Instrukcje ze strony Apple:

Aby zaimportować kod Swift do Objective-C z tego samego frameworka

W obszarze Ustawienia kompilacji , w sekcji Pakowanie , upewnij się, że ustawienie Definiuje moduł dla tego celu struktury szkieletowej jest ustawione na Tak . Zaimportuj kod Swift z tego celu frameworka do dowolnego pliku Objective-C .m w tym celu frameworku, stosując tę ​​składnię i zastępując odpowiednie nazwy:

#import „ProductName-Swift.h”

Rewizja:

Plik „ProductName-Swift.h” można importować tylko w plikach .m.

Pliki Swift w twoim celu będą widoczne w plikach .m Objective-C zawierających tę instrukcję importu.

Aby uniknąć cyklicznych odwołań, nie importuj Swift do pliku nagłówka Objective-C. Zamiast tego możesz przekazać deklarację klasy Swift, aby użyć jej w nagłówku Objective-C. Zauważ, że nie możesz podklasować klasy Swift w Objective-C.

wprowadź opis zdjęcia tutaj


2
Pomógł mi tylko import „ProductName-Swift.h” do plików .m. Dodanie tego samego pliku .pch dawało „Nie można znaleźć deklaracji protokołu dla„ CLLocationManagerDelegate ”; czy miałeś na myśli„ NSLayoutManagerDelegate ”?”
Alphonse R. Dsouza,

@Ait, to nie jest bezpośrednio, dokumentacja mówi, że. Najłatwiejszym sposobem jest utworzenie klasy Objective-C, która tłumaczy się w formacie zrozumiałym dla Objective-C ++. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Alejandro Iván

1
Pamiętaj, że musisz czerpać z NSObject!!! nie możesz po prostu ogłosić class Blah szybko i sprawić, by działało. to musi byćclass Blah : NSObject
David T.

Warto przeczytać tę odpowiedź w niektórych przypadkach: stackoverflow.com/questions/26328034/... W zależności od tego, co robisz: #import <nazwa_produktu / nazwa_modułu-swift.h> #import <nazwa_modułu-swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

Co jeśli chcesz zaimportować rozszerzenie Swift?
Ricardo

150

Oto co robić:

  1. Utwórz nowy projekt w Objective-C

  2. Utwórz nowy .swiftplik  

    • Pojawi się wyskakujące okienko z pytaniem „Czy chcesz skonfigurować nagłówek mostkujący Cel-C” .
    • Wybierz Tak .
  3. Kliknij plik projektu Xcode

  4. Kliknij Ustawienia kompilacji

  5. Znajdź pasek wyszukiwania i wyszukaj moduł Definiuje .

  6. Zmień wartość na Tak .

  7. Wyszukaj nazwę modułu produktu .

  8. Zmień wartość na nazwę swojego projektu.

  9. W aplikacji Deleguj dodaj następujące elementy: #import "YourProjectName-Swift.h"


Uwaga: Ilekroć chcesz użyć pliku Swift, musisz zaimportować następujący wiersz:

#import "YourProjectName-Swift.h"


1
Zmiana wartości Defines modulein Build settingsna Yesto, co naprawiło dla mnie rzeczy!
Zakaria Braksa

Zawartość osadzona zawiera Swift: TAK. UŻYJ tego również
Mohit

4
dobra odpowiedź, ale kroki 7-8 nie są potrzebne w Xcode 7.3.1 i wyższych
Sam B

Pracował dla mnie! Dzięki.
itsdamslife

1
Chcę tylko dodać, że YourProjectNamein #import "YourProjectName-Swift.h"będzie nazwą projektu z kroku 8. Przydatne, jeśli nazwa twojego projektu zawiera znaki specjalne i nie wiesz, jak dokładnie go sformatować.
Chuck Boris,

40

Jeśli używasz Cocoapods i próbujesz użyć kapsuły Swift w projekcie ObjC, możesz po prostu wykonać następujące czynności:

@import <FrameworkName>;

wprowadź opis zdjęcia tutaj


1
Wielkie dzięki! uratowałeś mi dzień
Esza

Działa to jak urok, jeśli zainstalowaliśmy szybką bibliotekę za pośrednictwem Cocoapods. Pozytywne !!!
NSPratik,

21

Przejdź do ustawień kompilacji w pliku projektu i wyszukaj „Nazwa nagłówka interfejsu wygenerowanego przez Objective-C . Wartością tej właściwości jest nazwa, którą powinieneś dołączyć.

Jeśli własność „Nazwa modułu produktu” (ta, od której domyślnie zależy powyższa właściwość) różni się w zależności od tego, czy kompilujesz dla testu / debugowania / wydania / itp. (Tak jak w moim przypadku), uniezależnij tę właściwość od tego zmiana przez ustawienie niestandardowej nazwy.


15

Importowanie Swiftpliku do wewnątrz Objective-cmoże spowodować ten błąd, jeśli nie zostanie importpoprawnie wykonany.

UWAGA: Nie musisz importować plików Swift zewnętrznie, wystarczy zaimportować jeden plik, który zajmuje się szybkimi plikami.

Podczas tworzenia / kopiowania pliku Swift w projekcie Objective-C . Automatycznie utworzyłby nagłówek pomostowy.

Sprawdź Objective-C Generated Interface Header Namew Targets -> Build Settings.

wprowadź opis zdjęcia tutaj

Na podstawie powyższego zaimportuję KJExpandable-Swift.htak, jak jest.

Twój będzie TargetName-Swift.h, gdzie TargetNameróżni się w zależności od nazwy projektu lub innego celu, który mógł zostać dodany i uruchomiony na nim.

Jak poniżej, moim celem jest KJExpandable, więc jestKJExpandable-Swift.h
wprowadź opis zdjęcia tutaj


12

Pierwszy krok:-

Wybierz Cel projektu -> Ustawienia kompilacji -> Szukaj („Zdefiniuj”) -> Zdefiniuj wartość aktualizacji modułu Nie na Tak

„Definiuje moduł”: TAK .

„Zawsze osadzaj szybkie biblioteki standardowe”: TAK .

„Zainstaluj nagłówek zgodności Objective-C”: TAK .

wprowadź opis zdjęcia tutaj

Drugi krok:-

Dodaj klasę pliku Swift w pliku celu C „.h”, jak poniżej

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Zaimportuj „ProjectName (nazwa projektu) - Swift.h” do pliku „.m” celu C.

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

Deklaracja przekazania klasy (@class) klasy jest bardzo dobrym punktem! Dzięki!
Philipp Otto,

10

Jest jedno zastrzeżenie, jeśli importujesz kod Swift do plików Objective-C w tej samej strukturze. Musisz to zrobić, podając nazwę ramy i nawiasy kątowe:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkoto ustawienie kompilacji „Nazwa modułu produktu” ( PRODUCT_NAME = MyFramework).

Po prostu dodanie #import "MyFramework-Swift.h"nie zadziała. Jeśli sprawdzisz katalog produktów wbudowanych (przed dodaniem takiego #import, aby mieć co najmniej jedną udaną kompilację z jakimś kodem Swift w celu), to nadal powinieneś zobaczyć plik MyFramework-Swift.hw Headerskatalogu.


8

Jeśli masz projekt utworzony w Swift 4, a następnie dodano pliki Objective-C, zrób to w następujący sposób:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

Odniesienie: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


W moim kodzie, po zaktualizowaniu go do Swift 4.2 z swift 3. Nie działa
SNarula

jaki masz błąd? Użyłem powyższego kodu w Swift4.2 i działa dobrze.
Prashant Bhayani,

Ok, świetnie.
Prashant Bhayani

4

Zapoznaj się z uwagami przedpremierowymi dotyczącymi Swift i Celu C w tym samym projekcie

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

Powinieneś importować

#import "SCLAlertView-Swift.h"

3
Pokazał mi ten błąd: nie znaleziono pliku „SCLAlertView-Swift.h”.
Viktor Radchenko

2
Musi to być nazwa projektu, a nie nazwa pliku - patrz moja odpowiedź.
Bill

1
Dzięki za link do dokumentacji. Przydało się to w celach informacyjnych.
louielouie

2
Cytat z podanego linku: The name of this header is your product module name followed by adding "-Swift.h".Więc nie jest to nazwa klasy, jak napisałeś, ale nazwa modułu produktu, który zajmuje się importowaniem wszystkich szybkich plików, a nie tylko jednego konkretnego
Chris

4

Wyszukaj „Nazwa nagłówka interfejsu generowanego przez Objective-C” w Ustawieniach kompilacji celu, który próbujesz zbudować (powiedzmy, że to jest MyApp-Swift.h), i zaimportuj wartość tego ustawienia ( #import "MyApp-Swift.h") do pliku źródłowego, do którego próbujesz uzyskać dostęp twoje interfejsy Swift API.

Wartość domyślna dla tego pola to $(SWIFT_MODULE_NAME)-Swift.h. Możesz to zobaczyć, klikając dwukrotnie w polu wartości ustawienia „Nazwa nagłówka interfejsu generowanego przez Objective-C”.

Ponadto, jeśli masz nazwy myślników w nazwie modułu (powiedzmy, że to jest My-App), to we $(SWIFT_MODULE_NAME)wszystkich myślnikach zostaną zastąpione podkreślenia. Więc musisz dodać #import "My_App-Swift.h".


Lepsze niż zatwierdzone. Kreski zmarnowały 20 min. Nigdy nie odzyskam haha.
Roi Mulia

3

Jeśli chcesz użyć pliku Swift do klasy Objective-C , więc od Xcode 8 możesz wykonać następujące kroki:

Jeśli masz projekt w Objective-C:

  1. Utwórz nowy plik Swift
  2. Xcode automatycznie wyświetli monit o podanie pliku Bridge-Header
  3. Wygeneruj to
  4. Zaimportuj „ProjectName-Swift.h” do kontrolera Objective-C (importuj w implementacji, a nie w interfejsie) (jeśli w projekcie jest miejsce między nazwami, użyj podkreślenia „Project_Name-Swift.h”)
  5. Będziesz mógł uzyskać dostęp do swojej klasy Objective-C w Swift.

Skompiluj go i jeśli wygeneruje błąd linkera, taki jak: skompilowany z nowszą wersją języka Swift (3.0) niż poprzednie pliki (2.0) dla architektury x86_64 lub armv 7

Wprowadź jeszcze jedną zmianę w swoim

  1. Xcode -> Projekt -> Cel -> Ustawienia kompilacji -> Użyj starszej wersji językowej Swift -> Tak

Kompiluj i uruchamiaj.


1
nie otrzymuję tej opcji używania starszej szybkiej wersji językowej
rd_

1

Uważaj na myślniki i podkreślenia, można je pomieszać, a nazwa projektu i nazwa docelowa nie będą takie same jak SWIFT_MODULE_NAME.

Kreski i podkreślenia


1
#import <TargetName-Swift.h>

zobaczysz, kiedy wejdziesz z klawiatury #import <, a po automatycznym Xcode doradzi ci.


-1

Znajdź plik .PCH w projekcie. a następnie dodaj #import "YourProjectName-Swift.h"Spowoduje to zaimportowanie nagłówków klas. Aby nie trzeba było importować do określonego pliku.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.