Swift UI在协议中使用View(协议“ View”只能用作通用约束,因为它具有Self或相关的类型要求)

时间:2020-02-12 15:42:17

标签: ios swift protocols swiftui

我想在协议中使用View。

print("input {!r}, expected output {!r}, got {!r}".format(xi, xo, output))
                                                                         ^

协议“视图”只能用作通用约束,因为它 有自我或相关类型要求

我只想做与ViewController相同的事情。任何想法?

protocol Test {
    var view: View { get }
}

如果使用关联的类型,则会在其他协议中收到错误消息。

protocol Test {
    var viewController: UIViewController { get }
}

任何想法如何解决这个问题?谢谢:)

3 个答案:

答案 0 :(得分:0)

SwiftUI.View是一个协议,并且由于它使用Self(例如,在其body property中),因此无法直接将属性类型声明为View。 / p>

您可以在Test上定义关联的类型,并将该类型限制为View

protocol Test {
    associatedtype T: View
    var view: T { get }
}

答案 1 :(得分:0)

除非将该协议声明为关联类型,否则不能直接使用该协议,但是可以使用擦除的AnyView类型:

protocol Test {
    var view: AnyView { get }
}

创建AnyView实例可能会在代码中添加一些噪音,但是创建起来很容易。

答案 2 :(得分:0)

扩展了Cristik的解决方案:

protocol ViewFactoryProtocol {
    func makeView(parameter: SomeType) -> AnyView
}