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