首页 > 解决方案 > “某些协议”导致类型不符合协议

问题描述

我不明白为什么这不能编译。如果我从类型中删除where限制,它会这样做。P

import Combine

protocol Foo {
    associatedtype P: Publisher where P.Output == Int
    var publisher: P { get }
}

struct Bar: Foo {
    var publisher: some Publisher {
        Just(1)
    }
}

错误说Type 'Bar' does not conform to protocol 'Foo'。我想这是因为publisher返回类型不仅仅是 any some Publisher。但在 SwiftUI 中,View使用了类似的方法,只是它对类型没有限制View

有什么办法可以让这段代码编译吗?

标签: swiftcombine

解决方案


它不编译的原因是因为some Publisher声明了一个不透明的类型,但是协议要求该类型必须是“透明的”。

some Publisher是“不透明的”,因为调用者无法确切地看到属性实际上是什么类型,并且只能知道它符合Publisher. P.Output这与必须是的协议要求直接矛盾Int要检查P.OutputInt,你必须“看穿”some Publisher,但你不能。

由于编译器无法检查发布者的Output,它无法检查您的类型是否真的符合协议。因此它选择“安全路线”的结论是你的类型不符合协议。

我认为你应该使用AnyPublisher类型橡皮擦:

var publisher: AnyPublisher<Int, Never> {
    Just(1).eraseToAnyPublisher()
}

SwiftUI 的View协议没有这个问题,因为它不需要Body“透视”。它只要求 thatBody是 , 的构造Viewsome View,根据定义,它是。


推荐阅读