独立したenumに対応したPickerをもつviewを作りたい
SwiftUIで複数のenumに対応したPickerを作りたいと思っています。
enumを要素にするPickerは以下の様にすれば簡単に作る事ができます。
Swift
1enum Options1: String, Identifiable, CaseIterable { 2 case option1_1 = "OptionValue1_1" 3 case option1_2 = "OptionValue1_2" 4 case option1_3 = "OptionValue1_3" 5 var id: String { self.rawValue } 6} 7 8 9struct PartContentView: View { 10 @Binding var selectedOption: Options1 11 12 var body: some View { 13 VStack { 14 Picker("Select option", selection: $selectedOption) { 15 ForEach(Options1.allCases, id:.id) { option in 16 Text(option.rawValue.capitalized) 17 .tag(option) // (1) 18 } 19 } 20 } 21 } 22} 23 24struct ContentView: View { 25 @State private var selectedOption: Options1 = .option1_1 26 27 var body: some View { 28 VStack { 29 PartContentView(selectedOption: $selectedOption) 30 .padding() 31 32 Text("selected option value is (selectedOption.rawValue)") 33 .padding() 34 } 35 .padding() 36 } 37}
このとき、Option1と同じインターフェースを持つ
enum Options2: String, Identifiable, CaseIterable
を定義したとして、
"struct PartContentView"がOption1でもOption2でも動作するようにするは"PartContentView"をどう書けばいいのでしょうか。
PartContentViewにGenericsでenumの持つプロトタイプを提示すればいいかと思い、以下の様にしてみたのですが、
Swift
1enum Options1: String, Identifiable, CaseIterable, Hashable { 2 case option1_1 = "OptionValue1_1" 3 case option1_2 = "OptionValue1_2" 4 case option1_3 = "OptionValue1_3" 5 var id: String { self.rawValue } 6} 7 8enum Options2: String, Identifiable, CaseIterable , Hashable { 9 case option2_1 = "OptionValue2_1" 10 case option2_2 = "OptionValue2_2" 11 case option2_3 = "OptionValue2_3" 12 var id: String { self.rawValue } 13} 14 15 16struct PartContentView<T: Identifiable & CaseIterable & Hashable>: View { 17 @Binding var selectedOption: T 18 19 var body: some View { 20 VStack { 21 Picker("Select option", selection: $selectedOption) { 22 ForEach(T.allCases, id:.self) { option in 23 Text(option.rawValue) 24 .tag(option) // (1) 25 } 26 } 27 } 28 } 29}
ForEach(T.allCases, id:.self) { option in
Text(option.rawValue)
の行で
- Generic struct 'ForEach' requires that 'T.AllCases' conform to 'RandomAccessCollection'
- Value of type 'T' has no member 'rawValue'
とエラーになってしまい、うまくいきません。
SwiftUIにはまだ不慣れな部分が多く、そもそもの流儀に従っていない(Swiftyでない?)のであれば、どのようにするのがスマートでしょうか。
補足情報(FW/ツールのバージョンなど)
xcodeのバージョンは13.1、swiftのバージョンは5です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。