[英]Swift computed property return value
我有一个计算属性,如果失败,则该属性应返回一个对象或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。 看起来代码跳过了我的闭包函数,直接返回。
谢谢
您的实现存在几个问题。 首先,如果它的值可能为nil
,则不foundRequest
定义为隐式解包的可选。 其次,您要在异步函数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")
}
})
您可能必须从URLRequest
更改bookRequest
的类型,具体取决于输入参数book
的类型。
我有一个计算属性,如果失败,则该属性应返回一个对象或nil。
然后,您可能应该将其定义为:
var findRequest: Book? {
// ...
(请注意Book
之后的“?”)
而且,就像评论中提到的Martin一样,您的计算属性的getter应该立即返回一个值,但是您正在进行类似于异步调用的操作来检索该值。 在调用完成处理程序之前,getter本身立即返回。 访问属性的一侧无法获得API返回的实际值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.