Поиск…


Использование классов 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, ответ будет соответствующим образом обновлен.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow