鑒于此代碼:
let a = PassthroughSubject<Int, Never>()
let b = PassthroughSubject<Int, Never>()
let result = a.merge(with:b).eraseToAnyPublisher()
我認為那result會有型別AnyPublisher<Int, Never>,但它看起來像 Xcode 將其視為(我的空白格式):
AnyPublisher<
Publishers.MergeMany<
PassthroughSubject<Int, Never>
>.Output,
Publishers.MergeMany<
PassthroughSubject<Int, Never>
>.Failure
> (aka 'AnyPublisher<Int, Never>')
這不是我所期望的。我想隱藏了一些實作,但這遠不是我所希望的。很明顯,考慮到“aka”部分,Xcode 知道它等同于“AnyPublisher<Int, Never>”,但為什么不完全將其型別擦除呢?
我什至在鏈的前面嘗試過型別擦除,如下所示:
let a = PassthroughSubject<Int, Never>().eraseToAnyPublisher()
let b = PassthroughSubject<Int, Never>().eraseToAnyPublisher()
let result = a.merge(with:b).eraseToAnyPublisher()
這只是稍微好一點,因為 Xcode 認為result有型別:
AnyPublisher<
Publishers.MergeMany<
AnyPublisher<Int, Never>
>.Output,
Publishers.MergeMany<
AnyPublisher<Int, Never>
>.Failure
> (aka 'AnyPublisher<Int, Never>')
uj5u.com熱心網友回復:
這是因為eraseToAnyPublisher被宣告為:
func eraseToAnyPublisher() -> AnyPublisher<Self.Output, Self.Failure>
在您的情況下,Self是 type Publishers.MergeMany<PassthroughSubject<Int, Never>>>,因為它是merge回傳的。經過簡單的替換,替換Self為回傳的merge型別,則回傳型別eraseToAnyPublisher變為:
AnyPublisher<
Publishers.MergeMany<PassthroughSubject<Int, Never>>.Output,
Publishers.MergeMany<PassthroughSubject<Int, Never>>.Failure
>
當然,如果你遵循所有的型別別名,這就是與AnyPublisher<Int, Never>.
Xcode本來可以設計為只顯示“aka”型別,即在所有型別別名都已決議后的型別,但這種做法違背了型別別名的全部要點,即該型別應該由另一個名稱呼叫. 如果我有:
typealias Money = Decimal
func deposit(amount: Money) { ... }
我當然不希望這個函式在 Xcode 中只顯示為deposit(amount: Decimal)!
旁注:在 iOS 上,您還可以轉換為存在型別作為eraseToAnyPublisher.
a.merge(with:b) as any Publisher<Int, Never>
上面的呼叫eraseToAnyPublisher實際上會給你一個“短”的型別名稱,但真的沒有意義:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/535779.html
標籤:迅速代码结合
上一篇:如何在繼續之前等待getDownloadURL完成?
下一篇:Xcode14緩慢的增量構建
