fix(editor): PhotosPicker Sendable-Warning durch Sub-View struct

ImagePickerLabel als private View-Struct extrahiert. SwiftUIs
PhotosPicker(label:)-Closure ist @Sendable, aber View-Konstruktor-
Calls werden zur Build-Zeit MainActor-isoliert evaluiert — im
Gegensatz zu direktem @State-Zugriff im Closure-Body.

Vorher: pickerLabel als computed property → Warning blieb.
Jetzt: ImagePickerLabel(hasImage: occlusionImage != nil) →
       Warning weg, Swift-Build clean.

Archive grün, Build grün, keine Swift-Warnings mehr (nur eine
AppIntents-Framework-Hinweis-Note ohne Auswirkung).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-13 14:39:09 +02:00
parent 6a4d66fd74
commit e24e0e6825
2 changed files with 105 additions and 17 deletions

View file

@ -153,25 +153,11 @@ struct CardEditorView: View {
}
}
/// Extrahiert in eine eigene Property, weil PhotosPickers Label-Closure
/// unter Swift-6-Strict-Concurrency den direkten Zugriff auf
/// `@State`-Properties als Sendable-Verletzung markiert. Indirektion
/// über eine MainActor-isolierte computed Property löst das.
private var pickerLabel: some View {
Group {
if occlusionImage == nil {
Label("Bild auswählen", systemImage: "photo")
} else {
Label("Bild ersetzen", systemImage: "arrow.triangle.2.circlepath")
}
}
}
@ViewBuilder
private var imageOcclusionFields: some View {
Section("Bild") {
PhotosPicker(selection: $imagePickerItem, matching: .images) {
pickerLabel
ImagePickerLabel(hasImage: occlusionImage != nil)
}
.onChange(of: imagePickerItem) { _, newItem in
Task { await loadPickedImage(newItem) }
@ -364,3 +350,20 @@ private extension String {
trimmingCharacters(in: .whitespacesAndNewlines)
}
}
/// Wird als Sub-View aus dem PhotosPicker-Label-Closure aufgerufen.
/// Eigene `View`-Struct vermeidet die Swift-6-Strict-Concurrency-
/// Warning: SwiftUIs `PhotosPicker(label:)`-Closure ist `@Sendable`,
/// aber View-Konstruktor-Calls werden zur Build-Zeit MainActor-isoliert
/// evaluiert (im Gegensatz zu direktem @State-Zugriff im Closure-Body).
private struct ImagePickerLabel: View {
let hasImage: Bool
var body: some View {
if hasImage {
Label("Bild ersetzen", systemImage: "arrow.triangle.2.circlepath")
} else {
Label("Bild auswählen", systemImage: "photo")
}
}
}