我正在使我的View Identifiable像下面的代码:
struct RedView: View, Identifiable {
let id: UUID = UUID()
var body: some View {
Color.red.frame(width: 100, height: 100, alignment: .center)
}
}现在我想做一个只适用于ViewModifier,视图( Views,即Identifiable )的CustomViewModifier,例如,为了使普通的question/problem不需要我们的内容符合Identifiable,它们必须符合View,在这个question/problem中,我想做一个要求的CustomViewModifier,它的内容符合View和Identifiable,我怎么能这样做呢?
在这里,到目前为止尝试过的东西,需要帮助才能完成:
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
}
}发布于 2021-03-20 07:51:49
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
}
}https://stackoverflow.com/questions/66719127
复制相似问题