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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Q&A

解決済

1回答

7321閲覧

【Swift】配列の並び替え(sort)方法(独自クラス)

ishiishiyay

総合スコア33

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

0グッド

1クリップ

投稿2018/05/02 04:35

編集2018/05/02 04:39

ヒロポメと申します。
次世代チャットアプリを作っています!助けてください!( ;∀;)

現在Firebaseからコンテンツ情報(誰から、誰に、Firebase Storage内にあるメッセージ内容のurl、送信時間など)を取得して、配列に入れて、collection viewに表示させています。

ですが、メッセージの順番がバラバラになってしまいます。
4/21に送信したもの→4/26に送信したもの→4/18に送信したもの。といった具合です。
これは、そもそもFirebase Storage内で時間順になっていないからです。

そこで、こちらで並べ替える必要があると思っていますが、
Sort方法を色々調べたのですが全然うまくいかず、、、
お力貸していただけると助かります。

お手数ですが、アドバイス頂けますと幸いです。
よろしくお願いいたします。

**以下独自カスタムクラスです。
**

Swift

1 2class Message { 3 4 private var _senderId = ""; 5 private var _url = ""; 6 private var _timeStamp: NSNumber = 1 7 private var _toId = ""; 8 9 //クラスを初期化 10 init(senderId: String, url: String, toId: String, timeStamp: NSNumber) { 11 _senderId = senderId; 12 _url = url; 13 _toId = toId 14 _timeStamp = timeStamp 15 } 16 17 var senderId: String? { 18 get { 19 return _senderId; 20 } 21 } 22 23 var url: String? { 24 return _url; 25 //上のgetterの省略版 26 } 27 28 var toId: String? { 29 return _toId; 30 //上のgetterの省略版 31 } 32 33 var timeStamp: NSNumber? { 34 return _timeStamp; 35 //上のgetterの省略版 36 } 37 38}

次が、Firebase Databaseから必要な情報を取得して、配列に入れるところです。

Swift

1var messages = [Message]() 2 3//viewDidLoad内 4DBProvider.Instance.mediaMessagesRef.observe(.value, with: { (snapshot) in 5 6 if let dictionary2 = snapshot.value as? [String:AnyObject]{ 7 8 for d in dictionary2.values { 9 10 if let url = d["url"] as? String { 11 12 let senderId = d["sender_id"] as? String 13 14 let toId = d["toID"] as? String 15 16 let timeStamp = d["timeStamp"] as? NSNumber 17 18 let newContact = Message(senderId: senderId!, url: url, toId: toId!, timeStamp: timeStamp!); 19 20 //自分が送ったメッセージかつ、送り先が前画面(友達一覧リスト)で選んだ友達のとき。 21 if senderId == (Auth.auth().currentUser?.uid)! && toId! == self.toID { 22 23 self.messages.append(newContact); 24 } 25 //友達が送ったメッセージかつ、送り先が自分 26 else if senderId == self.toID && toId == Auth.auth().currentUser?.uid { 27 28 self.messages.append(newContact); 29 } 30 //自分からそれ以外に送ったメッセージや、友達が自分以外に送ったメッセージはスルーする。 31 32

ここまでで、collection view上に必要なコンテンツを表示させることには成功しています。
最後に、試してみたソートのコードを書きます。どれを実行しても順番は変わりませんでした。

Swift

1//パターン1 2 self.messages.sorted(by: {Double($0.timeStamp!) > Double($1.timeStamp!)}) 3//Double型に変換しているのは、そうしないと、次のエラーが出るかです。Binary operator '>' cannot be applied to two 'NSNumber' operands。 4//また、sort基準のtimeStampをsenderIdなどに変えても、順番は変わらないです。 5 6//パターン2 7 self.messages.sorted(by: { (first: Message, second: Message) -> Bool in 8 Double(first.timeStamp!) < Double(second.timeStamp!) 9 }) 10 11//パターン3 12 self.messages.sorted { (initial, next) -> Bool in 13 return Int(initial.timeStamp!) < Int(next.timeStamp!) 14 }

以下参考にさせていただいたリンクです。

swift3.0: Arrayの中身をソートする。

Swift how to sort array of custom objects by property value

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

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

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

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

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

guest

回答1

0

ベストアンサー

sorted(by:)メソッドはソートされた配列を返すメソッドで、元の配列はそのままです。

swift

1let sorted = array.sorted(by: <)

などのように使います。

配列自体をソートするには sort(by:)メソッドを使用します。

swift

1array.sort(by: <)

投稿2018/05/02 04:54

MasakiHori

総合スコア3384

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

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

ishiishiyay

2018/05/02 05:11

MasakiHoriさん、 できました!!! ありがとうございます!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問