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