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 @objc
lub dziedziczą NSObject
.
Uwagi:
Jeśli nazwa docelowa zawiera spacje, zamień je na podkreślenia (np. My Project
Staje 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 .swift
plik
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 module
in Build settings
na Yes
to, co naprawiło dla mnie rzeczy!
YourProjectName
in #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 Swift
pliku do wewnątrz Objective-c
może spowodować ten błąd, jeśli nie zostanie import
poprawnie 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 Name
w Targets -> Build Settings
.
Na podstawie powyższego zaimportuję KJExpandable-Swift.h
tak, jak jest.
Twój będzie TargetName-Swift.h
, gdzie TargetName
róż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>
MyFramework
oto 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.h
w Headers
katalogu.
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