在HomeRepositoryImpl中是getWorldWideData函式,它回傳AnyPublisher<WorldwideResponseItem, ErrorType>
func getWorldwideData() -> AnyPublisher<WorldwideResponseItem, ErrorType> {
let url = RestEndpoints.worldwideStats.endpoint()
let publisher: AnyPublisher<WorldwideResponseItem, ErrorType> = RestManager().fetchData(url: url)
return publisher
.flatMap {
let filteredCountries = Array($0.countries.sorted(by: {$0.totalConfirmed > $1.totalConfirmed}).prefix(3))
$0.countries = filteredCountries
return Just($0)
}
}
FlatMap從發布者那里獲取 WorldResponseItem,而WorldResponseItem具有我想要排序的國家/地區陣列屬性,因此我創建了名為filtersCountries的新變數并將其值更改為具有 3 個已排序國家/地區的陣列,并且我將WorldResponseItem國家/地區屬性更改為過濾國家和 flatMap 正在回傳 Just with WorldResponseItem來自出版商。
但是我得到No 'flatMap' Candidates generate the expected contextual result type 'AnyPublisher<WorldwideResponseItem, ErrorType>'錯誤,當我將.eraseToAnyPublisher()添加到管道時,我得到Type of expression is ambiguous without more context
uj5u.com熱心網友回復:
您的flatMap. 您需要在內部呼叫setFailureTypeand然后還呼叫自身。eraseToAnyPublisherJustflatMaperaseToAnyPublisherflatMap
在使用嵌套閉包時,您還應該使用命名閉包引數 - 您有一個sorted(by:)嵌套 inside flatMap。
func getWorldwideData() -> AnyPublisher<WorldwideResponseItem, ErrorType> {
let url = RestEndpoints.worldwideStats.endpoint()
let publisher: AnyPublisher<WorldwideResponseItem, ErrorType> = RestManager().fetchData(url: url)
return publisher
.flatMap { response -> AnyPublisher<WorldwideResponseItem, ErrorType> in
let filteredCountries = Array(response.countries.sorted(by: { $0.totalConfirmed > $1.totalConfirmed }).prefix(3))
response.countries = filteredCountries
return Just(response).setFailureType(to: ErrorType.self).eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
但是,您不應該首先使用flatMap。您只是將輸出映射到不同的值,因此您可以簡單地使用map,這大大簡化了閉包。
func getWorldwideData() -> AnyPublisher<WorldwideResponseItem, ErrorType> {
let url = RestEndpoints.worldwideStats.endpoint()
let publisher: AnyPublisher<WorldwideResponseItem, ErrorType> = RestManager().fetchData(url: url)
return publisher
.map { response -> WorldwideResponseItem in
let filteredCountries = Array(response.countries.sorted(by: { $0.totalConfirmed > $1.totalConfirmed }).prefix(3))
response.countries = filteredCountries
return response
}
.eraseToAnyPublisher()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/446942.html
下一篇:快速從多行字串回傳字典
