我正在嘗試在 Combine 中使用通用模塊化函式,但我得到了無法推斷通用的錯誤。
func foo<T>(data: T) -> AnyPublisher<Bool, MyError> {
}
func bar<T>(data: T) -> AnyPublisher<String, MyError> {
Deferred { [weak self] () -> AnyPublisher<Bool, MyError> in
guard let foo = self?.foo else { // error here
return Fail(error: .someError)
.eraseToAnyPublisher()
}
return foo(data)
}
.eraseToAnyPublisher()
.flatMap { [weak self] (value) -> AnyPublisher<String, MyError> in
Future<String, MyError> { [weak self] promise in
// do something with the returned value
promise(.success("Success"))
}
.eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
enum MyError: Error {
case someError
}
當我嘗試使用保護陳述句解包函式時出現錯誤。T沒有約束,因為它可能是多個不同的型別,Data或者UIImage在foo函式中進行型別檢查。
uj5u.com熱心網友回復:
當您遇到此類問題時,請簡化. 我們可以將現象簡化為一個非常簡單的情況:
class MyClass {
func foo<T>(data: T) -> Void { }
func bar<T>(data: T) -> Void {
let foo = self.foo // error
}
}
現在,首先要意識到的是,您有兩個單獨的 T 占位符。你說 T 關于foo和關于bar,但它們彼此沒有關系。我們可以更清楚地重寫:
class MyClass {
func foo<FooDataType>(data: FooDataType) -> Void { }
func bar<BarDataType>(data: BarDataType) -> Void {
let foo = self.foo // error: Generic parameter 'FooDataType' could not be inferred
}
}
現在很清楚問題出在哪里,因為我們知道編譯器遇到問題的占位符。當您這樣看時,您會意識到 FooDataType 完全限于foo. 怎么bar知道這是什么型別的?
如果您的想法是它們應該是同一型別,那么請說出來。使類成為通用類,而不是單個函式:
class MyClass<T> {
func foo(data: T) -> Void { }
func bar(data: T) -> Void {
let foo = self.foo // fine
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412127.html
標籤:
下一篇:java泛型的類層次結構問題
