我可以创建一个继承自 'View' 的协议来显示特定的 'View' 吗?
Can I make a protocol that inherits from 'View' to display a specific 'View'?
我正在尝试制作一些具有类似属性的 SwiftUI-View。所以我想为他们做一个协议,并显示这个协议的一个实例。
protocol SpecialView: View { ... }
struct SpecialViewA : View, SpecialView {
...
var body: some View {
Text("Hello World!")
}
}
struct ContentView: View {
var currentlyDisplayedView: some SpecialView
var body: some View{
currentlyDisplayedView
}
}
//in preview:
ContentView(SpecialViewA())
我希望 ContentView 接受我的 SpecialViewA 作为 SpecialView。但是,在预览中我得到
"Cannot convert value of type 'SpecialViewA' to expected argument type 'some SpecialView'"。
在尝试显示时我得到:
“[...] 要求 'some SpecialView' 符合 'View'”
我做错了什么?有没有更简单的方法?
你很接近...,但这将编译:
protocol SpecialView: View {
}
struct SpecialViewA : View, SpecialView {
var body: some View {
Text("Hello World!")
}
}
struct ContentView<V>: View where V: SpecialView {
var currentlyDisplayedView: V
var body: some View{
currentlyDisplayedView
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView(currentlyDisplayedView: SpecialViewA())
}
}
#endif
我正在尝试制作一些具有类似属性的 SwiftUI-View。所以我想为他们做一个协议,并显示这个协议的一个实例。
protocol SpecialView: View { ... }
struct SpecialViewA : View, SpecialView {
...
var body: some View {
Text("Hello World!")
}
}
struct ContentView: View {
var currentlyDisplayedView: some SpecialView
var body: some View{
currentlyDisplayedView
}
}
//in preview:
ContentView(SpecialViewA())
我希望 ContentView 接受我的 SpecialViewA 作为 SpecialView。但是,在预览中我得到 "Cannot convert value of type 'SpecialViewA' to expected argument type 'some SpecialView'"。 在尝试显示时我得到: “[...] 要求 'some SpecialView' 符合 'View'”
我做错了什么?有没有更简单的方法?
你很接近...,但这将编译:
protocol SpecialView: View {
}
struct SpecialViewA : View, SpecialView {
var body: some View {
Text("Hello World!")
}
}
struct ContentView<V>: View where V: SpecialView {
var currentlyDisplayedView: V
var body: some View{
currentlyDisplayedView
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView(currentlyDisplayedView: SpecialViewA())
}
}
#endif