Использовать блок ObjC в протоколе Swift - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь конвертировать код из Objective-C в Swift.Преобразовать все это будет невозможно, поскольку проект использует C ++ и, следовательно, Objective-C ++, но, по крайней мере, используемые протоколы должны быть написаны на Swift.

Поэтому при попытке преобразовать один с помощью блокакак свойство я наткнулся на проблемы.

Мой протокол Objective C:

@protocol ObjcProtocol<NSObject>

@property (nullable, nonatomic, copy, readwrite) dispatch_block_t callback;

@end

Мой протокол Swift:

@objc public protocol SwiftProtocol: NSObjectProtocol {
    var callback: ()->() { get set }
}

Попытка установить это свойство вObjective-C Я получаю эту ошибку:

«Обратный вызов свойства» не найден для объекта типа «NSObject *» »

Созданный файл заголовка Swift содержит следующее:

@property (nonatomic, copy) void (^ _Nonnull callback)(void);

Я тоже наткнулся на @convention(block).Объявление его непосредственно в var не работает, так как я получаю сообщение об ошибке, утверждая, что его можно использовать только как тип функции.Поэтому я попытался использовать typealias:

public typealias callBackType = (@convention(block) () -> ())

, что снова приводит к тому, что свойство не было найдено.

Что-то еще, что я пробовал, но безуспешно, явно аннотировалосвойство с @objc.

Установка необязательного типа функции обратного вызова также ничего не изменила.

Кроме того, я попытался создать протокол Objective-C, содержащий обратный вызов, и создать SwiftProtocolзависит от вновь созданного протокола.Тот же результат ...

Чего мне не хватает?

1 Ответ

0 голосов
/ 24 мая 2018

Хорошо ... так получилось, что хотя XCode может автоматически завершать код, это не значит, что все правильно импортировано в файл.Чтобы исправить вышесказанное, я добавил @import <ModuleName.Swift>;, и он работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...