Jak w Swift wywołuje się kod celu C?
Apple wspomniał, że mogą one współistnieć w jednej aplikacji, ale czy to oznacza, że można technicznie ponownie użyć starych klas stworzonych w Objective-C, budując nowe klasy w Swift?
objective-c
swift
David Mulder
źródło
źródło
Odpowiedzi:
Używanie klas Objective-C w Swift
Krok 1: Dodaj implementację celu C - .m
Dodaj
.m
plik do swojej klasy i nazwij goCustomObject.m
.Krok 2: Dodaj nagłówek pomostowy
Podczas dodawania
.m
pliku najprawdopodobniej wyświetli się następujący monit:Kliknij Tak !
Jeśli nie zobaczyłeś monitu lub przypadkowo usunąłeś nagłówek pomostowy, dodaj nowy
.h
plik do projektu i nazwij go<#YourProjectName#>-Bridging-Header.h
.W niektórych sytuacjach, szczególnie podczas pracy ze strukturami Objective-C, nie dodajesz wyraźnie klasy Objective-C i Xcode nie może znaleźć linkera. W takim przypadku utwórz
.h
plik o nazwie jak wspomniano powyżej, a następnie upewnij się, że łączysz jego ścieżkę w ustawieniach projektu docelowego w następujący sposób:Uwaga:
Najlepszą praktyką jest łączenie projektu za pomocą
$(SRCROOT)
makra, aby przeniesienie projektu lub praca nad nim przy użyciu zdalnego repozytorium nadal działała.$(SRCROOT)
może być uważany za katalog zawierający plik .xcodeproj. Może to wyglądać tak:Krok 3: Dodaj nagłówek celu C - .h
Dodaj kolejny
.h
plik i nazwij goCustomObject.h
.Krok 4: Zbuduj swoją klasę Objective-C
W
CustomObject.h
W
CustomObject.m
Krok 5: Dodaj klasę do nagłówka pomostowego
W
YourProject-Bridging-Header.h
:Krok 6: Użyj swojego obiektu
W
SomeSwiftFile.swift
:Nie ma potrzeby jawnego importowania; po to jest nagłówek pomostowy.
Używanie szybkich klas w celu C
Krok 1: Utwórz nową klasę Swift
Dodaj
.swift
plik do projektu i nazwij goMySwiftObject.swift
.W
MySwiftObject.swift
:Krok 2: Zaimportuj pliki Swift do klasy ObjC
W
SomeRandomClass.m
:Plik:
<#YourProjectName#>-Swift.h
powinien już zostać utworzony automatycznie w twoim projekcie, nawet jeśli go nie widzisz.Krok 3: Użyj swojej klasy
Uwagi:
Jeśli uzupełnianie kodu nie działa zgodnie z oczekiwaniami, spróbuj uruchomić szybką kompilację, ⌘⇧Raby pomóc Xcode znaleźć część kodu Objective-C z kontekstu Swift i odwrotnie.
Jeśli dodasz
.swift
plik do starszego projektu i otrzymasz błąddyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, spróbuj całkowicie zrestartować Xcode .Chociaż pierwotnie było możliwe użycie czystych klas Swift (nie potomków
NSObject
), które są widoczne dla Objective-C przy użyciu@objc
prefiksu, nie jest to już możliwe. Teraz, aby być widocznym w Objective-C, obiekt Swift musi albo być klasą zgodną zNSObjectProtocol
(najprostszym sposobem na to jest dziedziczenieNSObject
), albo byćenum
oznaczony@objc
surową wartością jakiegoś typu liczby całkowitejInt
. Możesz przeglądać historię edycji dla przykładu kodu Swift 1.x używającego@objc
bez tych ograniczeń.źródło
Zobacz przewodnik Apple dotyczący używania Swift z kakao i Objective-C . Ten przewodnik obejmuje korzystanie z kodu Objective-C i C z Swift i vice versa oraz zawiera zalecenia dotyczące konwertowania projektu lub mieszania i dopasowywania części Objective-C / C i Swift w istniejącym projekcie.
Kompilator automatycznie generuje składnię Swift do wywoływania funkcji C i metod Objective-C. Jak widać w dokumentacji, cel C:
zamienia się w ten kod Swift:
Xcode wykonuje również to tłumaczenie w locie - możesz użyć Otwórz szybko podczas edycji pliku Swift i wpisać nazwę klasy Objective-C, a przeniesie Cię to do nagłówka klasy Swift-ified. (Można to również uzyskać, klikając cmd symbol API w pliku Swift). Cała dokumentacja referencyjna API w bibliotekach programistów iOS 8 i OS X 10.10 (Yosemite) jest widoczna zarówno w Objective-C, jak i Swift formularze (np
UIView
.).źródło
Oto instrukcje krok po kroku dotyczące używania kodu Objective-C (w tym przypadku frameworku dostarczonego przez firmę zewnętrzną) w projekcie Swift:
W prostych krokach:
Pojawi się monit, a następnie kliknij przycisk OK ... Jeśli się nie pojawi, wówczas tworzymy go ręcznie, jak poniżej: Utwórz jeden plik nagłówka ze źródła iOS i nadaj nazwę ProjectName-Bridging-Header (przykład: Test -Bridging-Header), a następnie przejdź do kompilacji w kodzie kompilatora Swift -> Most Cel-C dodaj nazwę mostu Cel-C .. (Test / Test-Bridging-Header.h). Tak, to koniec.
Opcjonalnie usuń dodany plik Objective-C (o nazwie „cokolwiek” na powyższym obrazku GIF). Już go nie potrzebujesz.
Otwórz mostkowy plik nagłówkowy - nazwa pliku ma postać [YourProject] -Bridging-Header.h . Zawiera komentarz dostarczony przez Xcode. Dodaj wiersz kodu dla pliku Objective-C, który chcesz dołączyć , na przykład frameworku innej firmy. Na przykład, aby dodać Mixpanel do swojego projektu, musisz dodać następujący wiersz kodu do mostkowego pliku nagłówkowego:
Teraz w dowolnym pliku Swift możesz użyć istniejącego kodu Objective-C, w składni Swift (w przypadku tego przykładu i możesz wywołać metody Mixpanel SDK itp.). Musisz zapoznać się ze sposobem, w jaki Xcode tłumaczy Objective-C na Swift. Poradnik Apple'a to szybka lektura. Lub zobacz tę odpowiedź, aby uzyskać niepełne podsumowanie.
Przykład dla Mixpanel:
Otóż to!
Uwaga: Jeśli usuniesz plik nagłówka pomostowego z projektu , przejdź do Ustawień kompilacji i usuń wartość „ Celujący nagłówek pomostowy C ” w „Kompilatorze Swift - Generowanie kodu”.
źródło
Możesz przeczytać miły post Swift & Cocoapods . Zasadniczo musimy utworzyć mostkowy plik nagłówkowy i umieścić tam wszystkie nagłówki Cel-C. A następnie musimy odwołać się do tego w naszych ustawieniach kompilacji. Następnie możemy użyć kodu Objective-C.
Zobacz także dokument Apple'a Używanie Swift z kakao i Objective-C .
źródło
Napisałem prosty projekt Xcode 6, który pokazuje, jak mieszać kod C ++, Objective-C i Swift:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
W szczególności przykład wywołuje funkcję Objective-C i C ++ od Swift .
Kluczem jest utworzenie wspólnego nagłówka Project-Bridging-Header.h i umieszczenie tam nagłówków Objective-C.
Pobierz projekt jako kompletny przykład.
źródło
Jeszcze jedno chciałbym tutaj dodać:
Jestem bardzo wdzięczny za odpowiedź @ Logana. Bardzo pomaga w tworzeniu pliku pomostu i ustawień.
Ale po wykonaniu wszystkich tych kroków nadal nie dostaję klasy Objective-C w Swift.
Korzystałem z
cocoapods
biblioteki i zintegrowałem ją z moim projektem. Który jestpod "pop"
.Jeśli więc używasz kapsułów Celu-C w Swift, może istnieć szansa, że nie będziesz w stanie dostać
import
się do Swift lub klas.Prostą rzeczą, którą musisz zrobić, to:
<YOUR-PROJECT>-Bridging-Header
pliku i#import <ObjC_Framework>
na@import ObjC_Framework
Na przykład: (Pop Library)
Zastąpić
z
Użyj,
clang import
gdy#import
nie działa.źródło
Cytat z dokumentacji :
źródło
Tylko uwaga dla każdego, kto próbuje dodać bibliotekę Objective-C do Swift: Powinieneś dodać -ObjC w Ustawieniach kompilacji -> Łączenie -> Inne flagi Linkera .
źródło
Po utworzeniu nagłówka Bridging przejdź do Build Setting => Wyszukaj „Cel-C Bridging Header”.
Tuż poniżej znajduje się plik „„ Nazwa nagłówka interfejsu generowanego przez Objective-C ””.
Zaimportuj ten plik do kontrolera widoku.
Przykład: W moim przypadku: „Dauble-Swift.h”
źródło
Kliknij menu Nowy plik i wybierz plik wybierz język Cel. W tym momencie automatycznie generuje plik „Objective-C Bridging Header”, który służy do zdefiniowania nazwy klasy.
„Nagłówek mostkujący Objective-C” w „Swift Compiler - Generowanie kodu”.
źródło
źródło
Dodałem projekt na github, który zawiera małą próbkę do szybkiego wywołania kodu celu c.
Wywołaj klasę ObjectiveC z szybkiego
źródło
W projekcie Swift 4.2.1 w Xcode 10.1 możesz łatwo dodać plik Objective-C. Wykonaj poniższe czynności, aby połączyć plik Objective-C z projektem Swift.
Krok_01: Utwórz nowy projekt Xcode za pomocą języka Swift:
File
>New
>Project
>objc
.Krok_02: W projekcie Swift dodaj nowy plik Objective-C:
File
>New
>File...
>macOS
>Objective-C File
.Krok_03: Jeśli dodasz nowy plik Objective-C do projektu Swift za pierwszym razem, Xcode zapyta:
Would you like to configure an Objective-C bridging header
?Krok_04: Wybierz opcję:
Create Bridging Header
.Krok_05: Odpowiedni plik zostanie wygenerowany o nazwie:
Objc-Bridging-Header.h
.Krok_06: Teraz potrzebujesz ścieżki pliku mostu w nagłówku mostu. W Nawigatorze projektów kliknij projekt o nazwie,
objc
a następnie wybierz:Build Settings
>Objective-C Bridging Header
>Objc-Bridging-Header.h
.Krok_07: Przeciągnij i upuść swoje
Objc-Bridging-Header.h
w to pole, aby wygenerować ścieżkę do pliku.Krok_08: Otwórz
Objc-Bridging-Header.h
plik i zaimportuj plik Objective-C, którego chcesz użyć w pliku Swift.Oto treść
SpecialObjcFile.m
:Krok_09: Teraz w swoim pliku Swift możesz użyć klasy Objective-C:
źródło
Odpowiedź Logans działa dobrze, z wyjątkiem najnowszych,
Swift 5
że daje błąd kompilatora. Oto poprawka dla osób pracujących nad Swift 5.Szybki 5
źródło
Szybki konsument, producent Objective-C
Dodaj nagłówek
.h
i.m
pliki implementacji - plik klasy kakao (cel C)Na przykład
MyFileName
skonfiguruj nagłówek mostkujący
Kiedy zobaczysz
Would you like to configure an Objective-C bridging header
kliknij - Tak<target_name>-Bridging-Header.h
zostanie wygenerowany automatycznieDodaj klasę do Bridging-Header
W
<target_name>-Bridging-Header.h
dodaj linię#import "<MyFileName>.h"
PS Jeśli chcesz dodać istniejące pliki Objective-C do projektu Swift, dodaj je
Bridging-Header.h
wcześniejCel C konsument, producent Swift
Dodaj
<MyFileName>.swift
i rozszerzaNSObject
Zaimportuj pliki Swift do klasy ObjC
Dodaj
#import "<#YourProjectName#>-Swift.h"
do pliku Objective-COznacz publiczny kod Swift [@objc i @objcMembers]
źródło
Apple przedstawił oficjalny przewodnik w tym dokumencie: how-to-call-aim-c-code-from-swift
Oto odpowiednia część:
Aby zaimportować zestaw plików Objective-C do kodu Swift w ramach tego samego celu aplikacji, polegasz na pliku nagłówkowym mostkującym Objective-C, aby udostępnić te pliki Swiftowi . Xcode oferuje utworzenie tego nagłówka po dodaniu pliku Swift do istniejącej aplikacji Objective-C lub pliku Objective-C do istniejącej aplikacji Swift.
Jeśli zaakceptujesz, Xcode tworzy plik nagłówka pomostowego wraz z plikiem, który tworzysz, i nadaje mu nazwę, używając nazwy modułu produktu, a następnie „-Bridging-Header.h”. Możesz także samodzielnie utworzyć mostkujący nagłówek, wybierając opcję Plik> Nowy> Plik> [system operacyjny]> Źródło> Plik nagłówka
Edytuj nagłówek pomostowy, aby udostępnić kod Objective-C kodowi Swift:
Wszelkie publiczne nagłówki Celu C wymienione w nagłówku pomostowym są widoczne dla Swift.
źródło
Dwukierunkowe podejście do użycia celu-c celu-c
1
2)
Teraz dobrze iść Dzięki
źródło