簡體   English   中英

iOS RxSwift如何檢查Result == .success?

[英]iOS RxSwift how to check if Result == .success?

我只對來自查詢的.success類型的結果感興趣。

如何設置過濾器,使其僅通過Result<Value>枚舉的.success結果?

public enum Result<Value> {
    case success(Value)
    case failure(Error)
}


query.filter{ (result: Result<Double>) in
                switch result {
                case .success:
                    return true
                case .failure:
                    return false
                }
            }

我只想對成功進行速記​​檢查,但是編譯器不允許這樣做。

.filter{result in
    return result == .success
}

這是一個單線,不像您描述的那么短,但是比開關短:

if case .success = result { return true } else { return false }

具有關聯值的枚舉需要模式匹配,因此您需要一個if / switch / for / while來實現。

另外,如果您在多個地方使用這種過濾,則可以擴展Result

extension Result {
    var isSuccess: Bool { if case .success = self { return true } else { return false } }

    var isError: Bool {  return !isSuccess  }
}

,並使用以下擴展名:

query.filter { $0.isSuccess }

或一種函數方法,其中isSuccessisError是全局函數:

func isSuccess<T>(_ result: Result<T>) -> Bool {
    if case .success = result { return true } else { return false }
}

func isError<T>(_ result: Result<T>) -> Bool {
    return !isSuccess(result)
}

// later in the code
query.filter(isSuccess)

后一種方法帶來一點點性能上的好處,因為編譯器不需要每次都創建另一個閉包,而將使用以isSuccess名稱存儲的閉包。 盡管它並不完全符合建議添加成​​員函數而不是自由函數的Swift約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM