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

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

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

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

Q&A

解決済

1回答

380閲覧

画像をsort関数で降順に並べ替えたい

amazon_106

総合スコア50

Swift

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

0グッド

0クリップ

投稿2019/04/16 15:48

###やりたいこと
sort関数で投稿した画像を降順に並べ替えたい。

###現在の状況
firebase上に投稿が2つあり、timeIntervalSince1970プロパティなどを使い昇順で表示することはできた。

降順に並べる為に以下のコードを追加した

self.posts.sort(by: { (post1, post2) -> Bool in return post1.creationDate > post2.creationDate }) self.collectionView.reloadData() })

以下がエラーコード

Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

Outlet接続問題ではありません。Storyboardを使わず、コードで書いているからです。

こちらの記事だと
unexpectedly found nil while unwrapping an Optional value
は予期していないnilを発見した時に起きるエラーで、!で宣言した変数はnilが代入されない事を保証するという事らしいのですが、どれを!から?に変えるのかわからないです。

投稿画像を表示するswiftファイル

override func viewDidLoad() { super.viewDidLoad() // Register cell classes ユーザーページに投稿画像を表示させる self.collectionView!.register(UserPostCell.self, forCellWithReuseIdentifier: reuseIdentifier) }
// cell に情報を入れる関数 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { // Identifierが"reuseIdentifier(Cell)"でUserPostCellというクラスのcellを取得 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! UserPostCell cell.post = posts[indexPath.item] return cell }

投稿画像のcell

import UIKit class UserPostCell: UICollectionViewCell { // fire var post: Post? { didSet { guard let imageUrl = post?.imageUrl else { return } // 画像のキャッシュを読み込む 画面をロードする度にAPI(database)から読み込まないようにローカルで投稿データの保存する postImageView.loadImage(with: imageUrl) } } let postImageView: UIImageView = { let iv = UIImageView() iv.contentMode = .scaleAspectFill iv.clipsToBounds = true iv.backgroundColor = .lightGray return iv }() // viewDidLoad()的なところ override init(frame: CGRect) { super.init(frame: frame) addSubview(postImageView) postImageView.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }

投稿データ用のswiftファイル

import Foundation class Post { // 空の変数宣言 // database内のposts項目に合わせる var caption: String! var likes: Int! var imageUrl: String! var ownerUid: String! // 日付 var creationDate: Date! var postId: String! // プロパティの初期化 // Dictionary keyとvalueを持った、関連付けられた配列 AnyObject Int型でもString型でも保管してくれる init(postId: String!, dictionary: Dictionary<String, AnyObject>) { self.postId = postId // Databaseのpostsの中に入りcaptiontというkeyを持ったvalue valueかどうかわかんない if let caption = dictionary["caption"] as? String { self.caption = caption } if let likes = dictionary["likes"] as? Int { self.likes = likes } if let imageUrl = dictionary["imageUrl"] as? String { self.imageUrl = imageUrl } if let ownerUid = dictionary["ownerUid"] as? String { self.ownerUid = ownerUid } if let creationDate = dictionary["creationDate"] as? Double { self.creationDate = Date(timeIntervalSince1970: creationDate) } } }

正直何が原因でエラー表示が出るのかさっぱりわからないです。ヒントでもくださると嬉しいです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソートを入れなければ動くのに、ソートを入れただけでクラッシュしたのなら該当の箇所が問題なのでしょう。
この場合はPostクラスのcreationDateDate! 型なのが怪しいです。

ソートすると全てのオブジェクトに一度はアクセスするので、一つでも creationDate == nil のオブジェクトがあればクラッシュします。
creationDate == nil のオブジェクトがないか確認してみてください。

例えばPostクラスのinitで下のコードを書いてみて、ログを監視するか、またはprint文の所にbreakpointを張って動かしてみると分かると思います。

Swift

1if let creationDate = dictionary["creationDate"] as? Double { 2 self.creationDate = Date(timeIntervalSince1970: creationDate) 3} else { 4 print("creationDateが存在しない") 5}

creationDate == nilのオブジェクトがあった場合、どう解決するかは仕様によります。
つまりcreationDateがnilのPostオブジェクトを許容するか、許容しないかです。

許容するなら、creationDateの型をDate?にして、アクセスするたびにnilかどうかをチェックすることになります。
許容しないなら creationDate が nil だったら初期化を失敗させます。

このnilを許容するかしないかはcreationDate以外のプロパティにも同じことが言えますが、質問とは関係ないので割愛します。

投稿2019/04/16 16:46

u39ueda

総合スコア950

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

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

amazon_106

2019/04/18 04:18

初心者の僕でもわかりやすい解説ありがとうございます。 Post.swiftに回答頂いたコードを書いた結果、コンソールに「creationDateが存在しない」と表示されました。 そこで、 ``` if let creationDate = dictionary["creationData"] as? Int { self.creationDate = Date(timeIntervalSince1970: TimeInterval(creationDate)) } else { print("creationDateが存在しない") } ``` と書き加えた結果、無事、シミュレーター上で降順に表示されるようになりました。 コードも示してくれたのが、Swift勉強中の僕にとって、助かったし嬉しかったです。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問