Jak zaimportować Kod Swift do Objective-C?

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

Czy są jakieś sposoby na import?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Author: Tamás Sengel, 2014-06-08

13 answers

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

Ten pojedynczy plik jest autogenerowanym nagłówkiem, który definiuje Interfejsy Objective-C dla wszystkich klas Swift w Twoim projekcie, które są przypisane @objc lub dziedziczone z NSObject.

Rozważania:

  • Jeśli nazwa docelowa zawiera spacje, zastąp je podkreślnikami (np. My Project staje się My_Project-Swift.h)

  • Jeśli twój cel jest framework, musisz zaimportować <TargetName/TargetName-Swift.h>

  • Upewnij się, że Twój plik Swift jest członkiem docelowego

 330
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 10:22:40

Instrukcje ze strony Apple:

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

Pod Build Settings , w Packaging upewnij się, że definiuje Moduł ustawienie dla tego celu ramowego jest ustawione na Tak . Importuj Kod Swift z tego celu ramowego na dowolny cel-C .m file within that Framework target używając tej składni i zastępując odpowiednią nazwy:

#import "Nazwa Produktu-Swift.h "

Revision:

Możesz importować tylko " ProductName-Swift.h" w .pliki M.

Pliki Swift w Twoim celu będą widoczne w Objective-C .pliki m zawierające to Oświadczenie o imporcie.

Aby uniknąć cyklicznych odniesień, Nie Importuj Swift do Objective-C plik nagłówkowy. Zamiast tego możesz zadeklarować klasę Swift, aby z niej korzystać w nagłówku Objective-C. Zauważ, że nie możesz podklasować klasy Swift w Objective-C.

Tutaj wpisz opis obrazka

 121
Author: Andrei Papancea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 19:50:12

Oto co należy zrobić:

  1. Utwórz nowy projekt w Objective-C

  2. Utwórz nowy plik .swift  

    • pojawi się okno popup i zapyta "Czy chcesz skonfigurować nagłówek mostkowy Objective-C" .
    • Wybierz Tak .
  3. Kliknij plik projektu Xcode

  4. Kliknij na Build Settings

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

  6. Zmień wartość na Tak .

  7. Szukaj Nazwa Modułu Produktu .

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

  9. W App delegate dodaj następujące : #import "YourProjectName-Swift.h"


Uwaga: Gdy chcesz użyć pliku Swift, musisz zaimportować następującą linię:

#import "YourProjectName-Swift.h"

 111
Author: Sumit singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 10:21:07

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

@import <FrameworkName>;

Tutaj wpisz opis obrazka

 27
Author: KingPolygon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-29 20:18:22

Przejdź do konfiguracji w pliku projektu i wyszukaj " wygenerowana przez Objective - C Nazwa nagłówka interfejsu. wartość tej właściwości jest nazwą, którą powinieneś zawrzeć.

Jeśli twoja właściwość "Product Module Name" (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 test/debug/release/etc (Jak to ma miejsce w moim przypadku), to uniezależnij tę właściwość od tej zmiany, ustawiając niestandardową nazwę.

 14
Author: Lukas Kalinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 11:46:53

Importowanie pliku Swift wewnątrz Objective-c może spowodować ten błąd, jeśli nie działa prawidłowo import.

Uwaga: nie musisz importować plików Swift zewnętrznie, wystarczy zaimportować jeden plik, który zajmuje się plikami swift.

Kiedy utworzyłeś/skopiowałeś plik Swift wewnątrz Objective-C project. Automatycznie utworzyłby nagłówek pomostowy.

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

Tutaj wpisz opis obrazka

Na podstawie powyższego, I zaimportuje KJExpandable-Swift.h tak, jak jest.

Twój będzie TargetName-Swift.h, Gdzie TargetName różni się w zależności od nazwy twojego projektu lub innego celu, który możesz dodać i na nim uruchomić.

Jak poniżej mój cel jest KJExpandable, więc to KJExpandable-Swift.h
Tutaj wpisz opis obrazka

 11
Author: KiranJasvanee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-04 10:59:42

Pierwszy Krok:-

Wybierz Cel Projektu - > Ustawienia Budowania - > Szukaj ('Definiuj') - > Zdefiniuj Moduł update value No to Yes

"definiuje Moduł": tak.

"zawsze osadzaj standardowe biblioteki Swift": tak.

"Install Objective - C Compatibility Header": yes.

Tutaj wpisz opis obrazka

Drugi Etap:-

Dodaj klasę plików Swift w celu C".H " Plik jak poniżej

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Import ' ProjectName (Nazwa Twojego Projektu) - Swift.h 'W celu C".m " plik

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

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

#import "ProjectName-Swift.h"
 9
Author: Darshan Panchal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 10:42:49

Jest jedno zastrzeżenie, jeśli importujesz Kod Swift do plików Objective-C w ramach tego samego frameworka . Musisz to zrobić podając nazwę frameworka i nawiasy kątowe:

#import <MyFramework/MyFramework-Swift.h>

MyFramework Oto ustawienie budowania " Product Module Name "(PRODUCT_NAME = MyFramework).

Proste dodanie #import "MyFramework-Swift.h" nie zadziała. Jeśli sprawdzisz katalog built products (przed dodaniem #import, więc masz przynajmniej jedną udaną kompilację z kodem Swift w celu), to powinien nadal widzieć plik MyFramework-Swift.h w katalogu Headers.

 7
Author: Misha Karpenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 10:07:12

Sprawdź wstępne informacje o Swift i Objective 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
Author: Nitin Alabur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 01:15:45

Wyszukaj "Objective-C Generated Interface Header Name" w Ustawieniach kompilacji obiektu docelowego, który próbujesz zbudować (powiedzmy, że jest to MyApp-Swift.h) i zaimportuj wartość tego ustawienia (#import "MyApp-Swift.h") do pliku źródłowego, w którym próbujesz uzyskać dostęp do interfejsów API Swift.

Domyślną wartością tego pola jest $(SWIFT_MODULE_NAME)-Swift.h. Możesz go zobaczyć, jeśli klikniesz dwukrotnie w polu wartość ustawienia "Objective-C Generated Interface header Name".

Również, jeśli masz myślniki w nazwie modułu (powiedzmy, że to My-App), wtedy w $(SWIFT_MODULE_NAME) wszystkie myślniki zostaną zastąpione podkreślnikami. Więc musisz dodać #import "My_App-Swift.h".

 2
Author: Misha Karpenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 08:12:34

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

Jeśli stworzyłeś projekt w Objective-C:

  1. Utwórz nowy plik Swift
  2. Xcode automatycznie zapyta o plik nagłówka mostu
  3. Wygeneruj go
  4. Import " Nazwa_projektu-Swift.h " w kontrolerze Objective-C (import w implementacji Nie w interfejsie) (jeśli projekt ma spację pomiędzy nazwą, więc użyj podkreślenie " Nazwa_projektu-Swift.h")
  5. będziesz mógł uzyskać dostęp do swojej klasy Objective-C w języku 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

Zrób jeszcze jedną zmianę w swoim

  1. Xcode -> Project -> Target -> Build Settings -> Use Legacy Swift Language Version - > Yes

Zbuduj i uruchom.

 1
Author: Dheeraj D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 04:55:56

Znajdź .Plik PCH wewnątrz projektu. a następnie dodaj #import "YourProjectName-Swift.h" to zaimportuje nagłówki klas. Dzięki temu nie musisz 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
 0
Author: Ram G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-18 20:31:18

Jeśli masz projekt utworzony w Swift 4, a następnie dodano pliki Objective C, wykonaj w ten sposób

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

}

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

 0
Author: Prashant Bhayani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 16:08:15