簡體   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