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.
Author: Peter Mortensen, 2014-06-03

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:

Tutaj wpisz opis obrazka

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:

Tutaj wpisz opis obrazka

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.

 1237
Author: Logan,
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).

 102
Author: rickster,
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:

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

  1. 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.

  2. Opcjonalnie Usuń dodany plik Objective-C (o nazwie "cokolwiek" na obrazku GIF powyżej). Już jej nie potrzebujesz.

  3. 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"
  4. 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".

 49
Author: derrrick,
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ż.

 30
Author: Jake Lin,
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.

 19
Author: Gian Luigi Romita,
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.

 17
Author: Gergo Erdosi,
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:

  1. przejdź do <YOUR-PROJECT>-Bridging-Header pliku i
  2. 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.

 15
Author: Kampai,
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 .

 7
Author: david72,
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 "

opis obrazu eEter tutaj

 3
Author: Avijit Nagare,
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".

 2
Author: Yogesh shelke,
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
  1. Utwórz .h Plik z NewFile -> Source - > header file
  2. 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.
  3. 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.
  4. Using #import Your_Objective-C_file.h
  5. w pliku swift można uzyskać dostęp do pliku ObjC, ale tylko w języku swift.
 1
Author: Nish,
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.

 0
Author: Peter Mortensen,
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

 0
Author: Sanjay Mali,
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

Tutaj wpisz opis obrazkadodałem projekt na github, który zawiera małą próbkę do wywołania kodu objective c Z swift.

Wywołanie klasy ObjectiveC z swift

 0
Author: CrazyPro007,
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?

Tutaj wpisz opis obrazka

Krok_04: wybierz opcję:

Create Bridging Header.

Krok_05: zostanie wygenerowany odpowiedni plik o nazwie:

Objc-Bridging-Header.h.

Tutaj wpisz opis obrazka

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.

Tutaj wpisz opis obrazka

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)
}

Tutaj wpisz opis obrazka Tutaj wpisz opis obrazka

 0
Author: Gigantic,
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