前提
Xcode 12.5
下部にあります「検証用コード」を実行することで本件の事象を再現できます。
疑問点
SwiftUIにてPicker
で次のようなデータ構造を持った配列を表示するとします。
swift
1struct DemoPickItem: Identifiable, Hashable { 2 var id: String { databaseID } 3 var databaseID: String 4 var name: String 5} 6
コンテンツを表示する際に、次のようにForEach
の引数id
にDemoPickItem
のid
やdatabaseID
を設定すると、Picker
のselection
に設定した値が変更されません。
swift
1 Picker("", selection: $demo) { 2 ForEach(datas, id: .id) { data in 3 Text("(data.name) : (data.databaseID)") 4 } 5 }
一方で、self
を設定するとselection
に設定した値がPicker
での選択状況に応じて変動します。
自分の認識ですと、ForEach
のid
に設定している値がDemoPickItem
のid
やdatabaseID
である場合、それは一意であり静的なので「selection
に設定した値がPicker
での選択状況に応じて変動」すると思っていました。
しかし、上述の通りそうならなかったのですがその理由がわからないです。
アドバイス頂けますと幸いです。
検証用コード
swift
1 2// MARK: Entity 3 4struct DemoPickItem: Identifiable, Hashable { 5 var id: String { databaseID } 6 var databaseID: String 7 var name: String 8} 9 10let demoPickItems = [ 11 DemoPickItem(databaseID: "01", name: "demo-name1"), 12 DemoPickItem(databaseID: "02",name: "demo-name2"), 13 DemoPickItem(databaseID: "03",name: "demo-name3"), 14 DemoPickItem(databaseID: "04",name: "demo-name4"), 15 DemoPickItem(databaseID: "05",name: "demo-name5"), 16] 17 18// MARK: View 19 20import SwiftUI 21 22struct DemoPickerDialogView01: View { 23 let datas: [DemoPickItem] 24 @State var demo: DemoPickItem = DemoPickItem(databaseID: "00",name: "demo-name") 25 26 var body: some View { 27 VStack { 28 Text(demo.name) 29 .padding(.top, 20) 30 31 Picker("", selection: $demo) { 32 ForEach(datas, id: .id) { data in 33 Text("(data.name) : (data.databaseID)") 34 } 35 } 36 .buttonStyle(PlainButtonStyle()) 37 38 Button(action: { 39 }) { 40 Text("閉じる") 41 .frame(minWidth: 0, maxWidth: .infinity) 42 .padding(.bottom, 20) 43 } 44 45 } 46 .cornerRadius(8) 47 } 48} 49 50#if DEBUG 51 52struct DemoPickerDialogView_Previews: PreviewProvider { 53 struct ContentView01: View { 54 var datas = demoPickItems 55 @State var data: DemoPickItem = demoPickItems[0] 56 @State private var dialogPresentation = DialogPresentation() 57 58 var body: some View { 59 NavigationView { 60 VStack { 61 DemoPickerDialogView01( 62 datas: demoPickItems 63 ) 64 } 65 } 66 } 67 } 68 69 static var previews: some View { 70 71 Group { 72 ContentView01() 73 } 74 } 75} 76 77#endif 78 79
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。