List や LazyVStack などの、
一つの要素の View の #Preview を
簡単に表示するというだけの件。
よくある List 的な View。

その一つの Item の View。
struct ItemView: View {
  var item: Item
  var body: some View {
    HStack {
      Spacer()
      Text("\(item.i)")
      Spacer()
      Text("\(item.s)")
    }
    .font(.largeTitle)
    .monospaced()
    .background()
  }
}
この一つの View だけを #Preview で簡単に表示したい。
🤔 #Preview 用の View
Container のセットはより上位の View でセットするのが定石。
🤔 使い方
一つ入れ子でクロージャ。
#Preview {
  PreviewOneModelView { item in
    ItemView(item: item)
  }
  .modelContainer(for: Item.self, inMemory: false)
}
🤔 参考
Apple 公式サンプルより簡易化して抜粋しました。
public struct ModelPreview<Model: PersistentModel, Content: View>: View {
    var content: (Model) -> Content
    
    public init(@ViewBuilder content: @escaping (Model) -> Content) {
        self.content = content
    }
    
    public var body: some View {
        ZStack {
            PreviewContentView(content: content)
        }
        .backyardBirdsDataContainer(inMemory: true) // * inMemory
    }
    
    struct PreviewContentView: View {
        var content: (Model) -> Content
        
        @Query private var models: [Model]
        @State private var waitedToShowIssue = false
        
        var body: some View {
            if let model = models.first { // * first
                content(model)
            } else {
                ContentUnavailableView {  // * could not get first item
                    Label {
                        Text(verbatim: "Could not load model for previews")
                    } icon: {
                        Image(systemName: "xmark")
                    }
                }
                .opacity(waitedToShowIssue ? 1 : 0)
                .task {
                    Task {
                        try await Task.sleep(for: .seconds(1))
                        waitedToShowIssue = true
                    }
                }
            }
        }
    }
}
👉 sample-backyard-birds/BackyardBirdsData/General/ModelPreview.swift · apple/sample-backyard-birds 
【 #SwiftData 】ModelContainer の View へのセット https://t.co/g2kZAvhsmN
— chanzmao (@maochanz) February 10, 2024
 
 
		 
           
          



