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

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

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

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

Q&A

2回答

573閲覧

配列を希望する順番に並び替える方法を知りたいです。

po_tato

総合スコア97

Swift

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

0グッド

0クリップ

投稿2018/06/15 07:34

このリンク先の解決に取り組んでいるのですが、リンク内容配列を並び替える方法を知りたいです。
alamofireで通信して帰ってくるjsonが下記のような感じなのですが、これがその下のソース内にあるforeachの中でjsonの並び順通りに配列して欲しいんですが、なぜかforeachの中でindex番号が順不同になるためバラバラに"banner"に入ってしまいます。
入ったものを最終的にjsonの並びに並び替えようと考えたのですが、
その方法が分かりません。
どういう考えができるでしょうか?
ご教示お願いいたします。

例)
jsonから10個取得できる。
それを順番に"banner"に入れたいがforeachのindexにより
[8,7,1,2,3,4,0,5,6,9]
このような並び順になってしまう。
それを最終的に
[0,1,2,3,4,5,6,7,8,9]
元のこの状態に直したい。

{ "list" : [ { "img_path" : "http://test1.png", "date" : "2018年06月10日", },   { "img_path" : "http://test2.png", "date" : "2018年06月11日",   }, ・・・同じように続く。。。
Alamofire.request("http://testapi~.php",method: .post, parameters: param).responseJSON { response in guard let object = response.result.value else{ return } let jsons = JSON(object) jsons["list"].forEach { (index, img_path) in self.race_date_time.append(img_path["date"].string!) print("ここでのindexの値は:(index)")//結果:0,1,2,3,.....綺麗な順番 Alamofire.request(img_path["url"].string!).responseImage { response in debugPrint(response.result) if let image = response.result.value { print("image downloaded: (image)") print("ここでのindexの値は:(index)")//結果:3,0,1,2,.....バラバラな順番 let imgratio:CGFloat = (image.size.height)/(image.size.width) let iw = CGFloat(self.sw) let resize = image.ResizeÜIImage(width: iw, height: iw*imgratio) self.BannerImage.append(img_path["img_path"].string!) print("BannerImageは(self.BannerImage)") self.banner.append(resize!) } } }

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

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

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

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

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

fuzzball

2018/06/15 07:46

リンク先の質問の私の回答は見ていないのでしょうか?
takabosoft

2018/06/15 09:03

画像10個のURLがあったら、それぞれを並列処理(別スレッド)で画像を読み込みに行っていると思いますので、 「配列を並び替えたい」という発想自体が間違っていませんかね?
po_tato

2018/06/15 09:04

その発想しか思いつきませんでした。。
takabosoft

2018/06/15 09:08

そもそも非同期処理と同期処理の違いは理解されていますでしょうか?
po_tato

2018/06/15 09:11

非同期処理は処理を止めずに並行して行えるからより早い処理になることは分かります。
takabosoft

2018/06/15 09:49 編集

言ってみれば別スレッドで画像をサーバーからDLして読み終わったら .responseImage {} のカッコ中がメインスレッドで実行される感じですよね。これで「バラバラな順番」になる理由は理解されたでしょうか? そこを理解した上で次のステップ(バラバラな順番の画像をどう組み立てるか)に行くべきかと思います。
po_tato

2018/06/15 09:51

分かりました。例えば、foreachでバラバラになるのは非同期なので仕方がないとして、そのindexと値をkey,valueで配列にセットで設置できれば、foreachが終わり全ての値がついた後で、key値を使いソートするということを考えたのですが、こう言ったことは可能な考えだと思われますか?
takabosoft

2018/06/15 09:57

それは可能です。 1. indexと値をkey,valueで配列にセットするのはどう書くか 2. 全ての値がついた判定(すべての画像が読み込み終わったかの判定)はどう書くか 3. key値を使いソートはどう書くか それぞれをまずは考えて書いてみてください。
po_tato

2018/06/15 10:18

わかりました!ありがとうございます!
fuzzball

2018/06/15 10:36 編集

前の質問で「apiから取得される順番ごとに表示したい」と書いていませんでしたっけ?10個単位でいいんですか?
po_tato

2018/06/18 00:50

返答遅れて申し訳ありません。はい、apiから取得される順番で表示したいです。ただ、一度に取得できる数は10個ずつということです。その次の10個を取得するときはリクエスパラメータのscroolcountを一つ増やし要求することで取得できるようになっています。
guest

回答2

0

index番号が順不同になるため

↑foreachをやる前に並べ替えればいいじゃない。

【Swift】配列をソートする方法(昇順・降順・逆順) | Fussan Blog

投稿2018/06/15 08:25

tkturbo

総合スコア5572

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

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

po_tato

2018/06/15 08:34

index番号をってことですか? foreachで初めてその個数文取得できる部分を どうやって初めから並び替えるのですか?
guest

0

前回質問の回答と同じですが。

api読み込み完了時

swift

1let arrayIndex = self.banner.count //※追加 要素番号保存 2self.race_date_time.append(img_path["date"].string!) 3self.banner.append(UIImage()) //※追加 ダミー画像追加
画像読み込み完了時

swift

1//self.banner.append(resize!) 2//の代わりに 3self.banner[arrayIndex] = resize! //差し替え

投稿2018/06/15 08:23

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問