実現したいこと
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のデータ加工に詳しい方いましたらお手柔らかにお願いいたします。
回答1件
あなたの回答
tips
プレビュー