Jak wywołać Kod Objective-C Z Swift
W nowym języku Swift od Apple, jak można nazwać Kod Objective-C?
Apple wspomniało, że mogą one współistnieć w jednej aplikacji, ale czy to oznacza, że można technicznie ponownie wykorzystać stare klasy wykonane w Objective-C podczas budowania nowych klas w Swift?
Rozumowanie
Objective-C jest językiem niezależnym od platformy, podczas gdy Swift jest zależny od platformy. Pisanie kodu nie zależnego od platformy (biblioteki logiki biznesowej) w języku Swift nie byłoby rozsądne. Jednak pisanie w nim kodu zależnego od platformy (na przykład związanego z interfejsem) byłoby w porządku. Nie mówiąc o tym, że byłby to dobry pomysł, jednak na pewno jest to zainteresowanie.15 answers
Używanie klas Objective-C w języku Swift
**
Jeśli masz istniejącą klasę, której chcesz użyć, wykonaj Krok 2 , a następnie przejdź do Krok 5. (W niektórych przypadkach musiałem dodać jawną #import <Foundation/Foundation.h
do starszego pliku Objective-C.)
**
Krok 1: Dodaj Implementację Objective-C -- .m
Dodaj plik .m
do swojej klasy i nazwij go CustomObject.m
.
Krok 2: Dodaj Nagłówek Mostkowy
Podczas dodawania pliku .m
prawdopodobnie zostaniesz trafiony znak zachęty, który wygląda tak:
Kliknij tak !
Jeśli nie widzisz znaku zachęty lub przypadkowo usunąłeś nagłówek pomostowy, Dodaj nowy plik .h
do swojego projektu i nadaj mu nazwę <#YourProjectName#>-Bridging-Header.h
.
W niektórych sytuacjach, szczególnie podczas pracy z frameworkami Objective - C, nie dodaje się jawnie klasy Objective-C i Xcode nie może znaleźć linkera. W takim przypadku utwórz swój plik .h
o nazwie wymienionej powyżej, a następnie upewnij się, że połączyłeś jego ścieżka w ustawieniach projektu docelowego tak:
Uwaga
Najlepszą praktyką jest łączenie projektu za pomocą makra $(SRCROOT)
, aby przenieść projekt lub pracować nad nim z innymi przy użyciu zdalnego repozytorium, nadal będzie on działał. $(SRCROOT)
może być traktowany jako katalog zawierający Twoje .plik xcodeproj. Może to wyglądać tak:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Krok 3: Dodaj Nagłówek Objective-C -- .h
Dodaj kolejny plik .h
i nazwij go CustomObject.h
.
Krok 4: Zbuduj swój cel - Klasa C
W CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
W CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Krok 5: Dodaj klasę do Bridging-Header
W YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Krok 6: Użyj swojego obiektu
W SomeSwiftFile.swift
:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Nie ma potrzeby jawnego importowania; do tego służy nagłówek pomostowy.
Używanie klas Swift w Objective-C
Krok 1: Utwórz Nową Klasę Swift
Dodaj plik .swift
do swojego projekt i nazwij go MySwiftObject.swift
.
W MySwiftObject.swift
:
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val"
init() {}
func someFunction(someArg:AnyObject) -> String {
var returnVal = "You sent me \(someArg)"
return returnVal
}
}
Krok 2: Import plików Swift do klasy ObjC
W SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Plik: <#YourProjectName#>-Swift.h
powinien być już utworzony automatycznie w Twoim projekcie, nawet jeśli go nie widzisz.
Krok 3: Użyj swojej klasy
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);
Uwaga:
1. uzupełnianie kodu nie zachowywało się tak dokładnie, jak bym tego chciał. W moim systemie, uruchomienie szybkiego kompilacji z "cmd + r" wydawało się pomóc Swift znaleźć kilka Kod Objective-C i odwrotnie.
2.Jeśli dodasz plik .swift
do starszego projektu i pojawi się błąd: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, spróbuj całkowicie ponownie uruchomić Xcode .
3. chociaż pierwotnie możliwe było użycie czystych klas Swift w Objective-C za pomocą prefiksu @objc
, po Swift 2.0, nie jest to już możliwe. Oryginalne Wyjaśnienie można znaleźć w sekcji Edycja historii. Jeśli ta funkcjonalność zostanie ponownie włączona w przyszłych wersjach Swift, odpowiedź zostanie zaktualizowana odpowiednio.
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-23 11:33:24
[[3]}zobacz poradnik Apple ' a dotyczący używania języka Swift z Cocoa i Objective-C . Ten przewodnik opisuje, jak korzystać z kodu Objective-C i c z Swift i vice versa oraz zawiera zalecenia dotyczące konwersji 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, ten Objective-C:
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
Zamienia się w ten szybki kod:
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)
Xcode wykonuje również to tłumaczenie w locie - możesz użyć Open Quickly podczas edycji pliku Swift i wpisać nazwę klasy Objective-C, a to zabierze cię do wersji SWIFT-ified nagłówka klasy. (Można to również uzyskać, klikając cmd na symbol API w pliku Swift.), A cała dokumentacja API w bibliotekach programistycznych iOS 8 i OS X v10.10 (Yosemite) jest widoczna zarówno w postaci Objective-C, jak i Swift (np. UIView
).
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-10-29 10:49:06
Oto instrukcje krok po kroku, jak używać kodu Objective-C (w tym przypadku framework dostarczony przez stronę trzecią) w projekcie Swift:
- Dodaj dowolny plik Objective - C do swojego projektu Swift wybierając File -> New -> New File -> Objective-C File. Po zapisaniu, Xcode zapyta, czy chcesz dodać nagłówek pomostowy . Wybierz " Tak ". Gif: dodawanie pustego pliku do projektu i generowanie nagłówka pomostowego http://www.derrrick.com/stackoverflow/1-empty-file.gif
W prostych krokach:
Pojawi się monit, a następnie kliknij OK... Jeśli nie pojawia się, wtedy tworzymy go ręcznie jak w poniższym... Utwórz jeden plik nagłówka ze źródła iOS i podaj nazwę ProjectName-Bridging-Header( przykład: test-Bridging-Header), a następnie przejdź do Ustawienia budowania w kodzie kompilatora Swift- > Objective-C bridge Dodaj nazwę Objective-C bridge ..(Test/Test-Bridging-Header.h). Tak, skończone.
Opcjonalnie Usuń dodany plik Objective-C (o nazwie "cokolwiek" na obrazku GIF powyżej). Już jej nie potrzebujesz.
-
Otwórz plik nagłówka mostkowania -- nazwa pliku ma postać [YourProject]-Bridging-Header.h . Zawiera komentarz Xcode. Dodaj wiersz kodu dla pliku Objective-C, który chcesz dołączyć , np. framework innej firmy. Na przykład, aby dodać Mixpanel do projektu, możesz będzie musiał dodać następujący wiersz kodu do pliku nagłówkowego pomostu:
#import "Mixpanel.h"
Teraz w dowolnym pliku Swift możesz użyć istniejącego kodu Objective-C, w składni Swift (w tym przykładzie można wywołać metody Mixpanel SDK, itd.). Musisz zapoznać się z tym, jak Xcode przekłada Objective - C na Swift. [[41]}Apple ' s guide to szybka lektura. Lub zobacz tę odpowiedź dla niekompletnego podsumowania.
Przykład dla Mixpanel: {]}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
Mixpanel.sharedInstanceWithToken("your-token")
return true
}
To jest to!
Uwaga: Jeśli usuniesz plik nagłówka mostkowego ze swojego projektu , przejdź do ustawień kompilacji i usuń wartość " Objective-C Bridging Header" w obszarze "Swift Compiler - Code Generation".
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-10-29 11:10:20
Możesz przeczytać ładny post Swift & Cocoapods. Zasadniczo musimy utworzyć plik nagłówkowy i umieścić tam wszystkie nagłówki Objective-C. A potem musimy odwołać się do niego z naszych ustawień budowania. Następnie możemy użyć kodu Objective-C.
let manager = AFHTTPRequestOperationManager()
manager.GET(
"http://example.com/resources.json",
parameters: nil,
success: { (operation: AFHTTPRequestOperation!,
responseObject: AnyObject!) in
println("JSON: " + responseObject.description)
},
failure: { (operation: AFHTTPRequestOperation!,
error: NSError!) in
println("Error: " + error.localizedDescription)
})
Zobacz też dokument Apple ' aużywanie Swift z Cocoa i Objective-C też.
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-10-29 10:51:34
Napisałem prosty projekt Xcode 6, który pokazuje jak mieszać C++, Objective - C i Swift code:
Https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
W szczególności przykładwywołuje funkcję Objective - C i c++ z programu Swift.
Kluczem jest utworzenie współdzielonego nagłówka, Project-Bridging-Header.h i umieść tam nagłówki Objective-C.
Proszę pobrać projekt jako kompletny przykład.
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-10-29 11:03:32
Cytat z dokumentacji:
Dowolny Framework Objective - C (lub biblioteka C), który jest dostępny jako moduł można importować bezpośrednio do Swift. Obejmuje to wszystkie Ramy systemu Objective-C-takie jak Foundation, UIKit i SpriteKit-a także wspólne biblioteki C dostarczane wraz z systemem. Na przykład, aby zaimportować fundament, wystarczy dodać to polecenie import do początek pliku Swift, w którym pracujesz:
import Foundation
To import sprawia, że wszystkie API Fundacji-w tym NSDate, NSURL, NSMutableData, oraz wszystkie ich metody, właściwości i kategorie-dostępne bezpośrednio w języku Swift.
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-02 20:43:55
Jeszcze jedna rzecz, którą chciałbym tu dodać:
Jestem bardzo wdzięczny za odpowiedź @Logan. Bardzo pomaga tworzenie pliku bridge i ustawień.
Ale po wykonaniu tych wszystkich kroków nadal nie dostaję klasy Objective-C w Swift.
Użyłem biblioteki cocoapods
i włączyłem ją do mojego projektu. Czyli pod "pop"
.
Więc jeśli używasz Objective-C pods w Swift To może być szansa, że nie będziesz w stanie uzyskać lub import
klas do Swift.
The prosta rzecz, którą musisz zrobić to:
- przejdź do
<YOUR-PROJECT>-Bridging-Header
pliku i - Zastąp wypowiedź
#import <ObjC_Framework>
na@import ObjC_Framework
Na przykład: (Biblioteka Pop)
Zastąp
#import <pop/POP.h>
Z
@import pop;
użyj clang import
, Gdy #import
nie działa.
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-10-29 11:14:49
Tylko uwaga dla tego, kto próbuje dodać bibliotekę Objective-C do Swift: powinieneś dodać - ObjC w Build Settings -> linkowanie -> inne flagi linkera .
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-10-29 11:17:13
Po utworzeniu nagłówka mostkowego przejdź do Build Setting = > Szukaj "Objective-C Bridging Header".
Poniżej znajduje się plik" "Objective-C Generated Interface Header Name".
Zaimportuj ten plik do kontrolera widoku.
Przykład: w moim przypadku: "Dauble-Swift.h "
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-10-29 11:16:00
Kliknij w menu Plik Nowy i wybierz Plik wybierz cel językowy. W tym czasie automatycznie generuje plik "Objective - C Bridging Header", który jest używany do definiowania nazwy jakiejś klasy.
"Objective - C Bridging Header" pod "Swift Compiler-Code Generation".
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-10-29 11:11:45
- Utwórz .h Plik z NewFile -> Source - > header file
- następnie zapisz nazwę pliku Your_Target_Name-Bridging-Header.H ludzie tutaj często popełniają błąd, przyjmując nazwę projektu, ale powinna to być Nazwa celu projektu, jeśli w przypadku, gdy oba są różne, ogólnie są takie same.
- Następnie w Ustawieniach budowania wyszukaj znacznik Objective-C Bridging Header i umieść adres nowo utworzonego pliku bridging, możesz to zrobić klikając prawym przyciskiem myszy na pliku - >pokaż w Finderze - > przeciągnij plik w obszarze tekstowym, a adres zostanie wypełniony.
- Using #import Your_Objective-C_file.h
- w pliku swift można uzyskać dostęp do pliku ObjC, ale tylko w języku swift.
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-06-29 07:09:37
Dowolny Framework Objective - C (lub biblioteka C), który jest dostępny jako moduł, może zostać zaimportowany bezpośrednio do Swift. Obejmuje to wszystkie frameworki systemu Objective-C-takie jak Foundation, UIKit i SpriteKit-jak również wspólne biblioteki C dostarczane wraz z systemem. Na przykład, aby zaimportować fundament, po prostu dodaj tę instrukcję import na górze pliku Swift, w którym pracujesz:
import Foundation
Ten import sprawia, że wszystkie API Fundacji-w tym NSDate, NSURL, NSMutableData i wszystkie ich metody, właściwości i kategorie-dostępne bezpośrednio w języku Swift.
Wziąłem to z dokumentacji Apple.
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-10-29 11:20:00
Podejście dwukierunkowe do stosowania objective-c objective-C
1
1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings.
3. Clean the Project
2
1. Create objective-c files in project(it automatically set path in Build Settings for you )
2. import .h file in bridge-Header file
Now good To go Thanks
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-04-13 09:39:37
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-05-19 16:27:52
W projekcie Swift 4.2 w Xcode 9.4 można łatwo dodać plik Objective-C. Wykonaj poniższe kroki, aby przenieść plik Objective-C do projektu 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 pyta:
Would you like to configure an Objective-C bridging header
?
Krok_04: wybierz opcję:
Create Bridging Header
.
Krok_05: zostanie wygenerowany odpowiedni plik o nazwie:
Objc-Bridging-Header.h
.
Step_06: teraz musisz ustawić ścieżkę pliku Bridge 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ść swój Objc-Bridging-Header.h
do to pole do generowania ścieżki do pliku.
Krok_08: Otwórz plik Objc-Bridging-Header.h
i zaimportuj plik Objective-C, którego chcesz użyć w pliku Swift.
#import "SpecialObjcFile.m"
Oto treść SpecialObjcFile.m
:
#import <Foundation/Foundation.h>
@interface Person: NSObject {
@public
bool busy;
}
@property
bool busy;
@end
Krok_09: teraz w pliku Swift możesz użyć klasy Objective-C:
override func viewDidLoad() {
super.viewDidLoad()
let myObjcContent = Person()
print(myObjcContent.busy)
}
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-12 21:43:00