我有一个计算属性,如果失败,应该返回一个对象或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。看起来代码会跳过我的闭包函数并直接返回。
由于
答案 0 :(得分:2)
您的实施存在一些问题。首先,如果foundRequest
的值可能为nil
,则不应将API.requestBook
定义为隐式解包的可选项。其次,您将返回异步函数foundRequest
的完成处理程序之外的值,因此您在nil
获取值之前返回,因此您将返回默认值{{1} },由于隐式解包的可选声明而被强制解包,因此错误。
此外,您不应在计算属性的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")
}
})
您可能需要更改bookRequest
的类型URLRequest
,具体取决于输入参数book
的类型。
答案 1 :(得分:0)
我有一个计算属性,如果失败,应该返回一个对象或nil。
然后你应该把它定义为:
var findRequest: Book? {
// ...
(请注意"?" Book
之后)
另外,就像Martin在评论中提到的那样,你的计算属性的getter应该立即返回一个值,但你正在做一个看起来像异步调用的东西来检索值。在调用完成处理程序之前,getter本身会立即返回。访问该属性的一方无法获得API返回的实际值。