🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

Q&A

解決済

2回答

517閲覧

swiftでデータの取り扱い方

teratailmacr2

総合スコア31

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

0グッド

0クリップ

投稿2019/10/13 01:27

編集2019/10/15 02:36

日付情報を持っているデータをDB等から取得し、それを新しい順に月毎にsectionを分けてtableViewに表示したいと考えています。

下記の様なデータの場合、どうすれば実現できますでしょうか?

Swift

1let result = [ 2 ["image": "", "price": "22", "name": "東京", "date": "2019-12-31 12:21:21"], 3 ["image": "", "price": "21", "name": "千葉", "date": "2019-12-04 12:34:56"], 4 ["image": "", "price": "20", "name": "埼玉", "date": "2019-11-23 08:01:58"], 5 ["image": "", "price": "32", "name": "滋賀", "date": "2019-05-05 08:01:58"], 6 ["image": "", "price": "33", "name": "京都", "date": "2019-04-10 08:01:58"], 7 ["image": "", "price": "31", "name": "大阪", "date": "2019-04-10 08:01:58"], 8 ["image": "", "price": "30", "name": "兵庫", "date": "2018-12-12 08:01:58"], 9]

ひとまず、Dictinary型にgroupingと言うものがあるのがわかったので、それで何とか出来そうな感じはするのですが、元々のデータが年月だけであれば実現出来そうなものの、時分秒まであると年月だけのフォーマットにしてからでないとグルーピング出来ない様な気がします。フォーマットの仕方はなんとなく分かりましたが、それを組み合わせる方法が分かりません。

Swift

1let df = DateFormatter() 2df.locale = Locale(identifier: "en_US_POSIX") 3df.calendar = Calendar(identifier: .gregorian) 4df.dateFormat = "yyyy-MM-dd HH:mm:ss" 5let res = Dictionary(grouping: result, by: { 6 df.string(from: df.date(from: $0["date"]!)!) 7})

また、仮に上記のコードが上手く動くようになったとして、並び順が新しいもの順に保証された形にする事は可能なのでしょうか?

期待する結果(よくわからないので形は適当です)

let res = [ ["2019-12": [ ["image": "", "price": "22", "name": "東京", "date": "2019-12-31 12:21:21"], ["image": "", "price": "21", "name": "千葉", "date": "2019-12-04 12:34:56"], ], ["2019-11": [ ["image": "", "price": "20", "name": "埼玉", "date": "2019-11-23 08:01:58"], ], ["2019-05": [ ["image": "", "price": "32", "name": "滋賀", "date": "2019-05-05 08:01:58"], ], ["2019-04": [ ["image": "", "price": "33", "name": "京都", "date": "2019-04-10 08:01:58"], ["image": "", "price": "31", "name": "大阪", "date": "2019-04-10 08:01:58"], ], ["2018-12": [ ["image": "", "price": "30", "name": "兵庫", "date": "2018-12-12 08:01:58"], ] ]

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

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

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

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

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

guest

回答2

0

ベストアンサー

自分の勉強になるのでちょっと作ってみました。

swift

1let df = DateFormatter() 2df.locale = Locale(identifier: "en_US_POSIX") 3df.calendar = Calendar(identifier: .gregorian) 4df.dateFormat = "yyyy-MM-dd HH:mm:ss" 5 6let df2 = DateFormatter() 7df2.dateFormat = "yyyy-MM" 8let res = 9 Dictionary(grouping: result) { 10 df2.string(from: df.date(from: $0["date"]!)!) 11 }.map { 12 [$0.key: $0.value] 13 }.sorted { 14 Array($0.keys)[0] > Array($1.keys)[0] 15 } 16print(res)

投稿2019/10/15 16:55

TakeOne

総合スコア6299

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

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

teratailmacr2

2019/10/16 03:25

ご回答ありがとうございます。 まさに私が求めていた方法です! フォーマットの異なる2つのインスタンスを用意する事がコツだったんですね。 mapの方は何をしているのかまだ理解出来ていませんが、少しずつ理解を深めていければと思います。 ありがとうございました!
guest

0

ちゃんとするには大変ですが、
いろいろ方法があるので、やりたいことのみ実現するには

filterやsortを使えば、目的のデータのみ取得できると思います。
https://qiita.com/motokiee/items/cf83b22cb34921580a52
https://swift.tecc0.com/?p=240

ちなみに比較しやすいように、日付はDate型もしくはDouble型に変換をおすすめしますが、
文字列の切り出し(2019-10-18 02:19:34などから"-", " ", ":"を省いたり、数字のみ取得したりetc)
、Intへ変換、比較のみでも力技ですが、なんとかなりますよ。

やり方がわからないとのことなので、
アドバイスまでに、
resultは[ [String:String] ]なので、日付のデータ(String)をDateに変換した
新たなArray [ [String:Any] ]を作成するか、構造体(struct)を作成(オススメ)し、
その日付(Date)の比較を上記のfilterで行えば、できますよ。

String->Dateに変換するのは下記のような、custom classを作成し、
引数に日付のデータを渡せば、Date型で返ってくるようになります。

Swift

1func convertStringToDate(string: String) -> Date { 2 let date:Date = // StringからDateへの変換コード 3 return date 4} 5 6func viewDidLoad() { // 変換の例 7 let a_string = "2019/10/14 02:18:45" 8 let a_Date = convertStringToDate(string: a_string) 9}

投稿2019/10/13 17:08

編集2019/10/13 17:26
hameji

総合スコア1380

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

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

teratailmacr2

2019/10/15 02:20

遅くなりましたがご回答ありがとうございます。 ちゃんとするのは大変なんですね! こう言った使い方は割とよくあるかと思いますし、PHPなら簡単に出来るので、かなり口を尖らせていました。。。 最終的には、一度に100件しかデータを取得出来ないので、テーブルビューの一番下に来たらまた続きの100件を取得して追加表示させたいと考えています。 取得するデータは正確に日付降順になるのでソートの問題はクリア出来るかもしれませんが、その場合、セクションの数が増える(?)し、そもそも不可能な気もしますが、無限スクロールで検索すると具体的なデータ処理は割愛されていますが、画面端に来た事を検知してデータを再取得するところまでの例は見つかったので、同様の事をされている人はいるのかなとも思います。 swift難しい。。。 教えていただいたURLを参考にもう少し頑張ってみます! 引き続き無知な私でも理解できるようご説明いただける方がいらっしゃいましたらご教授いただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問