ios - Swift 计算属性返回值

标签 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。看起来代码跳过了我的闭包函数并直接返回。

谢谢

最佳答案

您的实现存在多个问题。首先,如果 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 的类型更改 URLRequestbookRequest 类型。

关于ios - Swift 计算属性返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879372/

相关文章:

cocoa-touch - UIModalPresentationFormSheet 呈现表上的键盘处理

iOS 8 UIView 没有得到更新的问题

xcode - 在 Swift 中,用于设计控制台应用程序的代码重用选项是什么,我该如何实现它们?

swift - 创建一个 CountableClosedRange<Character>

java - java中的继承继承变量?

python - python中的变量前单 Asterisk 和双 Asterisk 有什么区别?

ios - AWS - 通过用户池进行 Cognito 登录和 Cognito 身份验证 [iOS]

ios - dispatch_sync 总是在主线程上调度一个 block

c - Swift 中释放 C-malloc() 内存?

c++ - 绕过 cin 语句的未初始化局部变量