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

God*_*ike 4 protocols ios swift swiftui

我想在协议中使用视图。

protocol Test {
    var view: View { get }
}
Run Code Online (Sandbox Code Playgroud)

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

我只想和我的 ViewController 做同样的事情。任何的想法?

protocol Test {
    var viewController: UIViewController { get }
}
Run Code Online (Sandbox Code Playgroud)

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

protocol Test2: Test { 
    //STUB
}
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?谢谢 :)

小智 5

SwiftUI.View是一个协议,因为它使用Self(例如,在它的body 属性中),你不能直接将属性类型声明为View.

您可以定义关联类型Test并将该类型限制为 a View

protocol Test {
    associatedtype T: View
    var view: T { get }
}
Run Code Online (Sandbox Code Playgroud)


Cri*_*tik 5

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

protocol Test {
    var view: AnyView { get }
}
Run Code Online (Sandbox Code Playgroud)

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