iOS
Быстрая и объективная совместимость
Поиск…
Использование классов Objective-C в Swift
Если у вас есть существующий класс, который вы хотите использовать, выполните Шаг 2, а затем перейдите к Шагу 5 . (В некоторых случаях мне пришлось добавить явный
#import <Foundation/Foundation.h
в старый файл ObjC)
Шаг 1: Добавить реализацию Objective-C - .m
Добавьте файл .m
в свой класс и назовите его CustomObject.m
Шаг 2: Добавить заголовок перемычки
При добавлении вашего .m
файла вы, вероятно, будете поражены подсказкой, которая выглядит так:
Нажмите ДА !
Если вы не увидели приглашение или случайно удалили заголовок моста, добавьте в проект новый файл .h
и назовите его <#YourProjectName#>-Bridging-Header.h
В некоторых ситуациях, особенно при работе с инфраструктурами ObjC, вы не добавляете класс Objective-C явно, и Xcode не может найти компоновщик. В этом случае создайте свой .h
файл с именем, указанным выше, затем убедитесь, что вы связали его путь в настройках проекта вашей цели следующим образом:
Заметка
Лучше всего связать свой проект с помощью макроса $(SRCROOT)
чтобы при перемещении вашего проекта или работе с ним с помощью удаленного репо, он все равно будет работать. $(SRCROOT)
можно рассматривать как каталог, содержащий ваш файл .xcodeproj. Это может выглядеть так:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Шаг 3: Добавить заголовок Objective-C - .h
Добавьте еще один файл .h
и назовите его CustomObject.h
Шаг 4: Создайте свой класс Objective-C
В CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
В CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Шаг 5: добавьте класс в заголовок-заголовок
В YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Шаг 6: Используйте свой объект
В SomeSwiftFile.swift
:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Нет необходимости явно импортировать, для чего нужен заголовок для моста.
Использование классов Swift в Objective-C
Шаг 1. Создание нового класса Swift.
Добавьте файл .swift
в свой проект и назовите его MySwiftObject.swift
В 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
}
}
Шаг 2: импорт файлов Swift в класс ObjC
В SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Файл: <#YourProjectName#>-Swift.h
должен быть создан автоматически в вашем проекте, даже если вы его не видите.
Шаг 3: Используйте свой класс
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);
Замечания:
1. CodeCompletion не вел себя так точно, как хотелось бы. В моей системе быстрый запуск w / cmd + r помог Swift найти код Objc и наоборот.
2. Если вы добавите файл .swift
в более старый проект и получите ошибку: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, попробуйте полностью перезапустить Xcode.
3. Хотя изначально было возможно использовать чистые классы Swift в Objective-C с помощью префикса @objc
, после Swift 2.0 это невозможно. См. Историю изменений для оригинального объяснения. Если эта функциональность будет повторно включена в будущих версиях Swift, ответ будет соответствующим образом обновлен.