質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

489閲覧

Swiftでデータを加工したい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2023/02/15 09:04

編集2023/02/17 08:58

実現したいこと

APIで取得してデータを構造体(Struct)で扱っています。
このデータを以下の形に加工したいです。

加工前

let student[StudentInfo] =
[
myApp.TestViewController.StudentInfo(name: "tanaka", secondName: "taro", age: 18),
myApp.TestViewController.StudentInfo(name: "tanaka", secondName: "hanako", age: 19),
myApp.TestViewController.StudentInfo(name: "suzuki", secondName: "yuuko", age: 17),
myApp.TestViewController.StudentInfo(name: "sato", secondName: "yuki", age: 17),
myApp.TestViewController.StudentInfo(name: "tanaka", secondName: "mitsuo", age: 18),
myApp.TestViewController.StudentInfo(name: "sato", secondName: "yuuta", age: 20),
myApp.TestViewController.StudentInfo(name: "sato", secondName: "daichi", age: 19),
myApp.TestViewController.StudentInfo(name: "sato", secondName: "taro", age: 19)
]

加工後

こんな感じに 名前 でカテゴリー分けしたいです。
[
tanaka: [(secondName: "taro", age: 18), (secondName: "hanako", age: 19), (secondName: "mitsuo", age: 18)],
suzuki: [(secondName: "yuuko", age: 17)],
sato: [(secondName: "yuki", age: 17), (secondName: "yuuta", age: 20), (secondName: "daichi", age: 19), (secondName: "taro", age: 19)]
]

目指している形

1:テーブルビューのセルに名前だけの配列を表示。
2:セルにはその名前に該当する生徒情報を保持(secondName, age)
3:セルをタップすると遷移先でその情報を利用

イメージ説明

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

Cannot convert value of type 'String' to closure result type 'TestViewController.StudentInfo.Category'

該当のソースコード

Swift

1import UIKit 2 3 // モデル:生徒情報 4 struct StudentInfo: Codable, Equatable, Comparable { 5 var name: String 6 var secondeName: String 7 var age: Int 8 9 // テスト 10 enum Category: String { 11 case tanaka 12 case suzuki 13 case sato 14 } 15 // ソートの為:型を統一する 16 static func == (lhs: CountryInfo, rhs: CountryInfo) -> Bool { 17 return lhs.name == rhs.name 18 } 19 20 // ソートの為:ソートの定義を決める 21 // ここではアルファベット順とする 22 static func < (lhs: CountryInfo, rhs: CountryInfo) -> Bool { 23 return lhs.name < rhs.name 24 } 25 } 26 27// 変数 28 var all_student_array: [StudentInfo] = [] 29 30 // 接続 31 @IBOutlet weak var tableView: UITableView! 32 33 class TestViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 34 35 override func viewDidLoad() { 36 super.viewDidLoad() 37 38 // 追加 39 self.all_student_array.append(student) 40 41 // アルファベット順に直す 42 self.all_student_array.sort() 43 44 // テスト 45 print( 46 """ 47 48 Elements of Array 49 =========================================== 50 """ 51 ) 52 all_student_array.forEach { print($0) } 53 54 // Grouping by Category 55 var groupedProducts: [CountryInfo.Category: [CountryInfo]] = Dictionary( 56 grouping: all_student_array, 57 by: { $0.name } // ここでエラーが出る 58 ) 59 60 print( 61 """ 62 63 Grouping by Category 64 =========================================== 65 """ 66 ) 67 groupedProducts.forEach { 68 print( 69 """ 70 \($0.key.rawValue) 71 \($0.value) 72 """ 73 ) 74 } 75 } 76} 77 78

試したこと

・配列要素をグループ化したディクショナリの作成
https://yagamo-style.com/2020/07/16/arraygrouping/

・構造体データをグループ化してディクショナリーで扱おうとしましたが上記のエラーが出てビルドに失敗しました。

・その他にもいろいろ試してみたのですがどうも上手く形にできません。

・データはAPIで取得しているので出来れば取得は一度だけで、構造体に入れたデータを加工して使い回したいと考えています。

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

データ加工の初心者のため各種名称が正確にわからない場合があります。
Swiftのデータ加工に詳しい方いましたらお手柔らかにお願いいたします。

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

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

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

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

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

y_waiwai

2023/02/15 09:34

提示のコードではどういう動作をし、どういう結果が出るのでしょうか。 詳しく説明しよう
MasakiHori

2023/02/16 23:58

間違い: [CountryInfo.Category: [CountryInfo]] 正解 : [String: [CountryInfo]] だとおもう
guest

回答1

0

ベストアンサー

APIの呼び出しを1回ではなく、2回 にすることで解決しました。
1:API呼び出し1回目は name だけの配列を作り重複を削除。
2:アルファベット順に並び替えてテーブルビューに表示。
3:セルには name だけの情報を持たせて、タップすると遷移先に name 送る。
4:遷移先で2回目のAPIを呼び出し。
5:取得したデータを構造体に追加
6:構造体データから nameで filter することでテーブルビューにカテゴライズされた情報を表示することができました。

参考:https://www.choge-blog.com/programming/swiftarraysearchstruct/
応用して contains 的なので検索することにしました。

投稿2023/02/16 08:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問