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
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
Odpowiedzi:
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
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.

NSObject!!! nie możesz po prostu ogłosić class Blah szybko i sprawić, by działało. to musi byćclass Blah : NSObject
Oto co robić:
Utwórz nowy projekt w Objective-C
Utwórz nowy .swiftplik
Kliknij plik projektu Xcode
Kliknij Ustawienia kompilacji
Znajdź pasek wyszukiwania i wyszukaj moduł Definiuje .
Zmień wartość na Tak .
Wyszukaj nazwę modułu produktu .
Zmień wartość na nazwę swojego projektu.
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"
Defines modulein Build settingsna Yesto, co naprawiło dla mnie rzeczy!
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ć.
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>;
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.
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.
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

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 .
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"
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.
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/
Zapoznaj się z uwagami przedpremierowymi dotyczącymi Swift i Celu C w tym samym projekcie
Powinieneś importować
#import "SCLAlertView-Swift.h"
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
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".
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:
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
Kompiluj i uruchamiaj.
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.
#import <TargetName-Swift.h>
zobaczysz, kiedy wejdziesz z klawiatury #import <, a po automatycznym Xcode doradzi ci.
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