繁体   English   中英

Swift计算的属性返回值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM