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

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

詳細はこちら
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

SNS

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

Q&A

1回答

815閲覧

Unexpectedly found nil while implicitly unwrapping an Optional valueのエラーで困っています

Nagi7

総合スコア5

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

SNS

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

0グッド

0クリップ

投稿2019/12/11 18:40

編集2019/12/12 03:56

前提・実現したいこと

SwiftでSNSアプリを開発しています。
ビルドしようとしたらタイムラインのViewControllerに

// 投稿したユーザーの情報をUserモデルにまとめる
let userModel = User(objectId: user.objectId, userName: user.userName)
userModel.displayName = user.object(forKey: "displayName") as? String

// 投稿の情報を取得
let imageUrl = user.object(forKey: "imageUrl") as! String

の部分で以下のエラーが出てきたので、解決をしたいです。

発生している問題・エラーメッセージ

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file /Users/apple/Desktop/Brio/Brio/Main Pages/Controller/RoomViewController.swift, line 293

該当のソースコード

Swift

1 2func loadTimeline() { 3 guard let currentUser = NCMBUser.current() else { 4 let storyboard = UIStoryboard(name: "SignIn", bundle: Bundle.main) 5 let rootViewController = storyboard.instantiateViewController(withIdentifier: 6 "RootNavigationController") 7 UIApplication.shared.keyWindow?.rootViewController = rootViewController 8 9 let ud = UserDefaults.standard 10 ud.set(false, forKey: "isLogin") 11 ud.synchronize() 12 return 13 } 14 15 let query = NCMBQuery(className: "Post") 16 17 // 降順 18 query?.order(byDescending: "createDate") 19 20 // 投稿したユーザーの情報も同時取得 21 query?.includeKey("user") 22 23 // オブジェクトの取得 24 query?.findObjectsInBackground({ (result, error) in 25 if error != nil { 26 SVProgressHUD.showError(withStatus: error!.localizedDescription) 27 } else { 28 29 // 投稿を格納しておく配列を初期化 30 self.posts = [Post]() 31 32 for postObject in result as! [NCMBObject] { 33 34 // ユーザー情報をUserクラスにセット 35 let user = postObject.object(forKey: "user") as! NCMBUser 36 37 // 退会済みユーザーの投稿を避けるため、activeがfalse以外のモノだけを表示 38 if user.object(forKey: "active") as? Bool != false { 39 40 // 投稿したユーザーの情報をUserモデルにまとめる 41 let userModel = User(objectId: user.objectId, userName: user.userName) 42 userModel.displayName = user.object(forKey: "displayName") as? String 43 44 // 投稿の情報を取得 45 let imageUrl = user.object(forKey: "imageUrl") as! String 46 47 let text = postObject.object(forKey: "text") as! String 48 49 // 2つのデータ(投稿情報と誰が投稿したか?)を合わせてPostクラスにセット 50 let post = Post(objectId: postObject.objectId, user: userModel, imageUrl: imageUrl, text: text, createDate: postObject.createDate, roomId: "") 51 52 // likeの状況(自分が過去にLikeしているか?)によってデータを挿入 53 let likeUsers = postObject.object(forKey: "likeUser") as? [String] 54 if likeUsers?.contains(currentUser.objectId) == true { 55 post.isLiked = true 56 } else { 57 post.isLiked = false 58 } 59 60 // いいねの件数 61 if let likes = likeUsers { 62 post.likeCount = likes.count 63 } 64 65 // 配列に加える 66 self.posts.append(post) 67 } 68 } 69 70 // 投稿のデータが揃ったらTableViewをリロード 71 self.RoomTableView.reloadData() 72 } 73 }) 74 } 75 76

試したこと

オプショナルバインディングの文を書いてみましたが、書き方の理解ができていないこともありエラーの解決にはなりませんでした。

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

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

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

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

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

vanderlvov

2019/12/12 01:23

コードブロックのインデントはおかしいです。修正してもらえますか?(XCodeで control + I) 追加で、エラーメッセージの詳細があれば助かります。
Nagi7

2019/12/12 04:03

ご指摘いただきありがとうございます。エラーメッセージの全文を記載致しましたが、コードブロックのインデントの修正はこちらでよろしかったでしょうか?
vanderlvov

2019/12/12 04:26

エラーメッセージありがとうございます。line 293とはなんでしょうか? RoomViewController.swiftの293行目はどれでしょうか?
Nagi7

2019/12/12 04:46

ご返信ありがとうございます。line 293は let userModel = User(objectId: user.objectId, userName: user.userName) の部分を指しております。
guest

回答1

0

順番でresultの内容とpostObject、その後userの内容を確認できますでしょうか?
breakpointを設定して、簡単に内容を確認できるはずです。
アクセス方法はどちらが正しいですか?(Nagi7さんのコードからのサンプルです)

user.object(forKey: "active")

user.userName

NIFCLOUD-mbaasの色んな事例を確認したけどuser.userNameのやり方を見た事はありません。あれば、リンクを教えてください。
仮説として:

swift

1 2//バグが発生した所 3// User(objectId: user.objectId, userName: user.userName) 4 5//もしかして、こんなやり方にした方がいいかもしれません。 6User(objectId: user.objectId, userName: user.object(forKey: "userName"))

いかがでしょうか。

投稿2019/12/12 06:01

vanderlvov

総合スコア687

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問