Я разрабатываю приложение для iOS на Swift4 с платформой Object-C под названием «YapDatabase».Существует функция Object-C с таким блоком в классе 'YapDatabaseConnection':
- (void)readWithBlock:(void (^)(YapDatabaseReadTransaction *transaction))block;
Я использую функцию следующим образом:
static func readNovelIds() -> [String]? {
let account = XFAccountManager.share().account
var events: [XFNovelClickEvent]?
OTRDatabaseManager.shared.readOnlyDatabaseConnection?.read({ (transaction) in
events = XFNovelClickEvent.allNovelClickEvents(accountId: account.uniqueId, transaction: transaction)
})
guard let clickEvents = events else {
return nil
}
let readNovelsIds = clickEvents.map {
$0.bookId ?? ""
}
return readNovelsIds
}
Я думал, что закрытие будетвыполняется сразу после того, как объявлен параметр 'events'.На самом деле замыкание не выполняется до возврата результата.Чтобы найти причину, я открываю файл с именем 'YapDatabaseConnection.h (Interface)', сгенерированный Xcode (с cmd + shift + o), и обнаружил, что функция была переведена в Swift следующим образом:
open func read(_ block: @escaping (YapDatabaseReadTransaction) -> Void)
Итак, как мне использовать эту функцию @noescap?