Szukaj…


Używanie klas Objective-C w Swift

Jeśli masz istniejącą klasę, której chcesz użyć, wykonaj krok 2, a następnie przejdź do kroku 5 . (W niektórych przypadkach musiałem dodać jawny #import <Foundation/Foundation.h do starszego pliku ObjC)

Krok 1: Dodaj implementację celu C - .m

Dodaj plik .m do swojej klasy i nazwij go CustomObject.m

Krok 2: Dodaj nagłówek pomostowy

Podczas dodawania pliku .m najprawdopodobniej zostanie wyświetlony monit o następującym brzmieniu:

wprowadź opis zdjęcia tutaj

Kliknij TAK !

Jeśli nie zobaczyłeś monitu 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 ze strukturami ObjC, nie dodajesz wyraźnie klasy Objective-C i Xcode nie może znaleźć linkera. W takim przypadku utwórz plik .h o nazwie wspomnianej powyżej, a następnie upewnij się, że łączysz jego ścieżkę w ustawieniach projektu docelowego w następujący sposób:

wprowadź opis zdjęcia tutaj

Uwaga

Najlepszą praktyką jest łączenie projektu za pomocą makra $(SRCROOT) , aby przeniesienie projektu lub praca nad nim przy użyciu zdalnego repozytorium nadal działała. $(SRCROOT) można traktować jako katalog zawierający plik .xcodeproj. Może to wyglądać tak:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

Krok 3: Dodaj nagłówek celu C - .h

Dodaj kolejny plik .h i nazwij go CustomObject.h

Krok 4: Zbuduj swoją klasę Objective-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 nagłówka pomostowego

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 właśnie służy nagłówek pomostowy.

Używanie szybkich klas w celu C

Krok 1: Utwórz nową klasę Swift

Dodaj plik .swift do swojego projektu 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: Zaimportuj pliki Swift do klasy ObjC

W SomeRandomClass.m :

#import "<#YourProjectName#>-Swift.h"

Plik: <#YourProjectName#>-Swift.h powinien już zostać automatycznie utworzony 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. CodeCompletion nie zachowywał się tak dokładnie, jak bym tego chciał. W moim systemie uruchomienie szybkiej kompilacji z „cmd + r” zdawało się pomagać Swiftowi w znalezieniu kodu Objc i odwrotnie.

2. Jeśli dodasz plik .swift do starszego projektu i dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib się błąd: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib , spróbuj całkowicie zrestartować Xcode.

3. Chociaż pierwotnie było możliwe użycie czystych klas Swift w Objective-C przy użyciu prefiksu @objc , po Swift 2.0 nie jest to już możliwe. Zobacz historię edycji dla oryginalnego wyjaśnienia. Jeśli ta funkcja zostanie ponownie włączona w przyszłych wersjach Swift, odpowiedź zostanie odpowiednio zaktualizowana.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow