Есть несколько проблем с вашей реализацией. Прежде всего, вы не должны определять foundRequest
как неявно развернутый необязательный параметр, если есть вероятность, что его значение будет nil
. Во-вторых, вы возвращаете значение вне обработчика завершения асинхронной функции API.requestBook
, поэтому вы возвращаете значение до того, как foundRequest
сможет получить значение, и, следовательно, вы возвращаете значение по умолчанию nil
, которое будет принудительно развернуто из-за неявно развернутого необязательное объявление, отсюда и ошибка.
Более того, вы не должны делать асинхронный запрос внутри геттера вычисляемого свойства, поскольку предполагается, что вычисляемые свойства сразу же возвращают значение.
Вы должны полностью изменить свою реализацию, чтобы сделать findRequest
функцией, возвращающей значение типа Book
внутри обработчика завершения.
func findRequest(bookRequest: URLRequest, completion: @escaping (Book?->Void)){
API.requestBook(book: bookRequest) { book in
if let book = book {
completion(book)
} else {
print("Could not find book")
completion(nil)
}
}
}
Вы можете вызвать функцию следующим образом:
findRequest(bookRequest: yourRequest, completion: { book in
if let book = book {
//use the returned value
} else {
print("Book not found")
}
})
Возможно, вам придется изменить тип bookRequest
с URLRequest
в зависимости от того, каким должен быть тип входного параметра book
.
person
Dávid Pásztor
schedule
25.08.2017