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

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

ただいまの
回答率

90.83%

  • Swift

    6511questions

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

  • Firebase

    466questions

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

  • SNS

    96questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 184

hiropome

score 7

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

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

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

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

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

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

class Message {

    private var _senderId = "";
    private var _url = "";
    private var _timeStamp: NSNumber = 1
    private var _toId = "";

    //クラスを初期化
    init(senderId: String, url: String, toId: String, timeStamp: NSNumber) {
        _senderId = senderId;
        _url = url;
        _toId = toId
        _timeStamp = timeStamp
    }

    var senderId: String? {
        get {
            return _senderId;
        }
    }

    var url: String? {
        return _url;
        //上のgetterの省略版
    }

    var toId: String? {
        return _toId;
            //上のgetterの省略版
    }

    var timeStamp: NSNumber? {
        return _timeStamp;
        //上のgetterの省略版
    }

}


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

var messages = [Message]()

//viewDidLoad内
DBProvider.Instance.mediaMessagesRef.observe(.value, with: { (snapshot) in

            if let dictionary2 = snapshot.value as? [String:AnyObject]{

                for d in dictionary2.values {

                    if let url = d["url"] as? String {

                        let senderId = d["sender_id"] as? String

                        let toId = d["toID"] as? String

                        let timeStamp = d["timeStamp"] as? NSNumber

                        let newContact = Message(senderId: senderId!, url: url, toId: toId!, timeStamp: timeStamp!);

                        //自分が送ったメッセージかつ、送り先が前画面(友達一覧リスト)で選んだ友達のとき。
                        if senderId == (Auth.auth().currentUser?.uid)! && toId! == self.toID {

                             self.messages.append(newContact);
                        }
                        //友達が送ったメッセージかつ、送り先が自分
                        else if senderId == self.toID && toId == Auth.auth().currentUser?.uid {

                             self.messages.append(newContact);
                        }
                        //自分からそれ以外に送ったメッセージや、友達が自分以外に送ったメッセージはスルーする。

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

//パターン1
          self.messages.sorted(by: {Double($0.timeStamp!) > Double($1.timeStamp!)})
//Double型に変換しているのは、そうしないと、次のエラーが出るかです。Binary operator '>' cannot be applied to two 'NSNumber' operands。
//また、sort基準のtimeStampをsenderIdなどに変えても、順番は変わらないです。

//パターン2
          self.messages.sorted(by: { (first: Message, second: Message) -> Bool in
                 Double(first.timeStamp!) < Double(second.timeStamp!)
                        })

//パターン3
           self.messages.sorted { (initial, next) -> Bool in
                            return Int(initial.timeStamp!) < Int(next.timeStamp!)
                        }

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

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

Swift how to sort array of custom objects by property value

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

let sorted = array.sorted(by: <)


などのように使います。

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

array.sort(by: <)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/02 14:11

    MasakiHoriさん、

    できました!!!
    ありがとうございます!!!!!

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6511questions

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

  • Firebase

    466questions

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

  • SNS

    96questions

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