簡體   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