![](/img/trans.png)
[英]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.