我有一个计算属性,如果失败,它应该返回一个对象或 nil。
var findRequest: Book {
get {
var foundRequest: Book!
API.requestBook(book: bookRequest) { book in
if book != nil {
foundRequest = book!
} else {
print("Could not find book")
foundRequest = nil
}
}
return foundRequest
}
}
当我运行代码时,在返回的 foundRequest 行上解包 Optional 值错误时意外发现 nil。看起来代码跳过了我的闭包函数并直接返回。
谢谢
最佳答案
您的实现存在多个问题。首先,如果 foundRequest
的值有可能为 nil
,则不应将其定义为隐式解包可选。其次,您在异步函数 API.requestBook
的完成处理程序之外返回值,因此您在 foundRequest
可以获取值之前返回,因此您正在返回nil
的默认值,由于隐式解包的可选声明,将被强制解包,因此会出现错误。
此外,您不应该在计算属性的 getter 内部发出异步请求,因为计算属性应该立即返回一个值。
您应该完全更改您的实现,使 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")
}
})
您可能需要根据输入参数 book
的类型更改 URLRequest
的 bookRequest
类型。
关于ios - Swift 计算属性返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879372/