【发布时间】:2021-03-20 07:14:14
【问题描述】:
我正在制作我的 View Identifiable 像这样的代码:
struct RedView: View, Identifiable {
let id: UUID = UUID()
var body: some View {
Color.red.frame(width: 100, height: 100, alignment: .center)
}
}
现在我想制作一个 CustomViewModifier,它只适用于或适用于 Views,它们是 Identifiable,例如制作正常的 ViewModifier,我们不需要我们的内容符合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
}
}
【问题讨论】:
-
见this。你无法决定
Content是什么。 -
@Sweeper:我知道,这就是为什么我要制作 CustomViewModifier,在它们传递到 CustomViewModifier 之前我可以通过我的内容看到它跨度>
-
@Sweeper:我添加了一些新代码来告诉你我想要什么
-
你好像没听懂。你在这里试图加强前提条件,这是你绝对做不到的。协议告诉你“要符合我的要求,你必须实现一个接受某种
View的方法”,但你坚持说“不,我只会提供一个接受 identifiable的方法>View"。你现在明白你为什么不讲理了吗? 不 使用ViewModifier而是使用View where Self: Identifiable的普通旧extension怎么样? -
查看我第一条评论中的链接。它应该解释
Content的声明位置。