[英]SwiftUI alternate views - Protocol type 'Any' cannot conform to 'View' because only concrete types can conform to protocols
[英]How can I make my custom ViewModifier works only on Contents/Views that conform (Identifiable and View) in SwiftUI?
我正在使我的视图可Identifiable
,如下所示:
struct RedView: View, Identifiable {
let id: UUID = UUID()
var body: some View {
Color.red.frame(width: 100, height: 100, alignment: .center)
}
}
现在我想制作一个仅适用于或适用于它们可Identifiable
的视图的CustomViewModifier ,例如要制作普通的 ViewModifier ,我们不需要我们的内容符合Identifiable
,它们必须符合View
,在这个问题/问题中我想要制作一个要求其内容符合View
和Identifiable
的CustomViewModifier ,我该怎么做?
到目前为止,这里有什么尝试,需要帮助来完成:
struct CustomViewModifier<InPutContent: View & Identifiable>: ViewModifier {
func body(content: InPutContent) -> some View {
return content.onAppear() { print(content.id) }
}
}
用例:
import SwiftUI
struct ContentView: View {
var body: some View {
RedView()
.modifier(CustomViewModifier()) // It must work! because RedView is Identifiable!
Text("Hello")
.modifier(CustomViewModifier()) // It must NOT work! because Text is not Identifiable!
}
}
更新:
struct CustomViewModifier<InPutContent: View & Identifiable>: ViewModifier {
var inPutContent: () -> InPutContent
func body(content: Content) -> some View {
return body2(content: inPutContent())
}
func body2(content: InPutContent) -> some View {
return content.onAppear() { print(content.id) }
}
}
用例:
import SwiftUI
struct ContentView: View {
var body: some View {
RedView()
.modifier(CustomViewModifier(inPutContent: { RedView() })) // compiles
Text("Hello")
.modifier(CustomViewModifier(inPutContent: { Text("Hello") })) // does not compile
}
}
ViewModifier
的要求之一是您能够修改任何视图。 显然,在这种情况下您不能这样做,因此ViewModifier
不适合。
尝试在View where Self: Identifiable
上编写扩展:
extension View where Self: Identifiable {
func printId() -> some View {
return onAppear() { print(id) }
}
}
用法:
struct ContentView: View {
var body: some View {
RedView()
.printId() // compiles
Text("Hello")
.printId() // does not compile
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.