Swift计算属性返回值

时间:2017-08-25 10:26:11

标签: ios swift variables computed-properties

我有一个计算属性,如果失败,应该返回一个对象或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。看起来代码会跳过我的闭包函数并直接返回。

由于

2 个答案:

答案 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返回的实际值。