iOS
Szybka i Cel-C interoperacyjność
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:
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:
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.