给定此代码:

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>')

而且这是just美元,不是我预期的.我猜有一些实现被隐藏了,但这并不是我所希望的.显然,考虑到"aka"部分,Xcode知道它等同于"AnyPublisher&lt;Int;Int;,Never&gt;",但为什么不完全删除它的类型呢?

我甚至在链条的前面try 过擦除文字,如下所示:

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>')

推荐答案

这是因为eraseToAnyPublisher被声明为:

func eraseToAnyPublisher() -> AnyPublisher<Self.Output, Self.Failure>

在您的例子中,Self是类型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>相同的类型.

Xcodecould被设计成只显示"aka"类型,即在所有类型别名都已被解析之后的类型,但这种类型与类型别名的全部要点(即类型should be called by another name)背道而驰.如果我有:

typealias Money = Decimal
func deposit(amount: Money) { ... }

我当然不希望这个函数在Xcodeonly中显示为deposit(amount: Decimal)

附注:在iOS上,您还可以强制转换为存在词类型as an alternative to eraseToAnyPublisher.

a.merge(with:b) as any Publisher<Int, Never>

在上面拨打eraseToAnyPublisher实际上会给你一个"短"的类型名称,但这真的没有意义:)

Swift相关问答推荐

SwiftUI—如何识别单词并获取视觉中的位置

当TextField变为空时,不会触发onChange

在SwiftUI中如何预览嵌套的ScrollView,以避免触发可刷新修饰符

SwiftUI 无法在实时活动中显示 SpriteView

在 RealmSwift 中表示范围值?

如何在 swift 5.0 中获取当前行

如何制作进度加载动画?

String(validatingUTF8:) 和 String(utf8String:) 之间有区别吗?

如何更新 UserDefault 中的特定值

SwiftUI Preview 不适用于 Core Data

不要从 NumberFormatter 获取货币符号

判断 Swift 程序是否正在输出到终端

如何从 LLDB 调用带有断点的 Swift 函数?

在 Swift 中,如何查看 Process() 传递给 shell 的字符串?

在 Swift 中强制崩溃的最简单方法

Xcode 6 中的嵌入式内容包含 Swift 代码构建设置有什么作用?

UITableViewAlertForLayoutOutsideViewHierarchy 错误:仅警告一次(iOS 13 GM)

如何在 Swift 中使用 Crashlytics 登录?

UILabel 文本不换行

Swift 中的单元测试致命错误