繁体   English   中英

如何使我的自定义 ViewModifier 仅适用于 SwiftUI 中符合(可识别和视图)的内容/视图?

[英]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 ,在这个问题/问题中我想要制作一个要求其内容符合ViewIdentifiableCustomViewModifier ,我该怎么做?

到目前为止,这里有什么尝试,需要帮助来完成:

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
 
    }
}

ViewModifier和扩展的比较

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM