質問するログイン新規登録

Q&A

解決済

2回答

3413閲覧

【SwiftUI】辞書型配列のキーと値をならべて、List表示させたい

kuwatsy

総合スコア6

0グッド

0クリップ

投稿2022/08/16 05:39

0

0

前提

SwiftUIを用いてiPhoneアプリを作ろうと考えている初心者です。

実現したいこと

辞書型の配列を作成し、その中身を "キー", "値"の順番で List { } に表示させたいのですが、うまく行きません。
以下のプログラムで言えば、
Tokyo 東京
Osaka 大阪
Chiba 千葉
Nara  奈良
Kyoto 京都
というふうに並べて表示させたいと思っております。

情けない質問ですが、よろしくお願い申し上げます。

発生している問題・エラーメッセージ

Closure containing control flow statement cannot be used with result builder 'ViewBuilder'

該当のソースコード

SwiftUI

1import SwiftUI 2 3struct DictionaryListView: View { 4 var dictionary: [String:String] = ["Tokyo":"東京","Osaka":"大阪","Chiba":"千葉","Nara":"奈良","Kyoto":"京都"] 5 6 var body: some View { 7 List { 8 for (key, value) in dictionary { 9 Text("\(key) \(value)") 10 } 11 } 12 } 13} 14 15 16struct DictionaryListView_Previews: PreviewProvider { 17 static var previews: some View { 18 DictionaryListView() 19 } 20}

試したこと

numbers = [1,2,3,4,5] という配列は、for ... in で表示ができたことを確認しています。

補足情報(FW/ツールのバージョンなど)

Xcode 13.4.1 を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

追記: ソート条件をコードで表現できれば以下でできるのですが、期待されている順序だと、私の方法では難しそうですね。

解決済みのようですが、ディクショナリの sorted(by:) を使うことで、ディクショナリ -> タプルの配列に変換できるので、こちらでも良いかと思います。

swift

1import SwiftUI 2 3struct DictionaryListView: View { 4 var dictionary: [String:String] = ["Tokyo":"東京","Osaka":"大阪","Chiba":"千葉","Nara":"奈良","Kyoto":"京都"] 5 6 var body: some View { 7 VStack { 8 // タプルの配列に変換(条件: キーの昇順でソート) 9 let sorted: [(key: String, value: String)] = dictionary.sorted { $0.key < $1.key} 10 11 // 配列なので List で繰り返し可能 12 List(sorted, id: \.key) { prefecture in 13 Text("\(prefecture.key), \(prefecture.value)") 14 } 15 } 16 .padding() 17 } 18}

投稿2022/08/22 23:52

編集2022/08/23 00:23
aokiplayer

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aokiplayer

2022/08/23 00:19

すみません、辞書順ではない並べ替えですね。 だとすると、私の回答ではダメでしたね。
kuwatsy

2022/08/23 21:29

いろいろ考えていただきありがとうございます。今後のために理解しておきたいと思います。またよろしくお願いします。
guest

0

ベストアンサー

辞書は、格納順序の情報を持っておらず、KeyとValueの組み合わせを登録しているだけなので、意図した順番で表示させるには、どの順番で表示するかを表す配列が必要です。
次のように、表示する順番を示すarrayを定義し、そのarrayをListに指定して、arrayの要素(英語都市名)とそれに対応する日本語都市名をdictionaryから引いて表示すれば、意図した順に表示できると思います。

swift

1struct DictionaryListView: View { 2 var dictionary: [String:String] = ["Tokyo":"東京","Osaka":"大阪","Chiba":"千葉","Nara":"奈良","Kyoto":"京都"] 3 var array: [String] = ["Tokyo", "Osaka", "Chiba", "Nara", "Kyoto"] 4 5 var body: some View { 6 List(array, id: \.self) { city in 7 Text("\(city) \(dictionary[city]!)") 8 } 9 } 10} 11

投稿2022/08/16 08:16

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuwatsy

2022/08/16 10:46

早速のご回答、大変ありがとうございました。別リストを作成してそれを辞書で検索表示する、というのは、私にとって全くもって目から鱗の解決方法でした。これで一挙にプログラミングが進みます。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問