Так что я застрял на этой проблеме какое-то время и не могу найти вопросы, касающиеся моей конкретной проблемы в Интернете.
Я пытаюсь установить значение в description
, которое определяется как ленивое вычисляемое свойство и использует самоисполняющееся замыкание.
Чтобы получить описание книги, я делаю вызов API, передавая другой обработчик обработчику завершения API, чтобы я мог задать описание книги внутри ленивого вычисляемого свойства.
Я знаю, что мой код неверен, так как я получаю ошибку:
Невозможно преобразовать значение типа '()' в указанный тип 'String'
class Book : NSObject {
func getInfo(for name: String, handler: @escaping (_ string: String) -> String) {
let task = URLSession.shared.dataTask(with: "foo_book.com" + name) { (data, response, error) in
guard let data = data else {return}
descriptionStr = String(data: data, encoding: .utf8) ?? "No description found"
handler(descriptionStr)
}
}
lazy var description: String = {
getInfo(for: self.name) { str in
return str
}
}()
}
Как установить значение description
?
Я пробовал два метода. Использование цикла while для ожидания логического значения: inelegant и поражения цели асинхронности. Использование временной переменной внутри description
- не работает, потому что getInfo возвращается до завершения вызова API.
В случае, если вам интересен мой вариант использования: я хочу отображать книги в виде отдельных представлений в табличном представлении, но не хочу делать вызовы API для каждой книги, когда открываю табличное представление. Таким образом, я хочу лениво сделать вызов API. Поскольку описания должны быть инвариантными, я решил сделать его вычисляемым свойством с отложенным вычислением, поскольку оно будет вычислено только один раз.
Редактировать: Для тех, кто задается вопросом, мое решение было в виде комментариев, упомянутых ниже. Мой подход был неправильным - вместо того, чтобы пытаться установить свойство асинхронно, я создал метод и получил описание в контроллере представления.