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

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

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

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

Swift

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

Q&A

解決済

1回答

1002閲覧

Unexpectedly found nil while implicitly unwrapping an Optional valueのエラーについて

goodyogurt

総合スコア1

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/09/23 09:44

前提・実現したいこと

XcodeでNCMBを用いています。
前の画面でボタンを押したら画面遷移すると同時に、NCMBのクラス(praise)に保存した文(word)がランダムでtextviewに表示されるようにしたいです。

しかし、ボタンを押すと遷移はできるのですが、ずっと読み込んでいて、しまいにはエラーが発生します。selectedPraiseにアンダーラインが表示されています。
イメージ説明
Tagをつけています。
イメージ説明

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

Unexpectedly found nil while implicitly unwrapping an Optional value

該当のソースコード

praiseTextView.text = selectedPraise.object(forKey: "word")as? String

selectedPraiseに赤でアンダーラインが引かれます。

試したこと・前の画面のコードの一部

調べても有効な対処法が出てこず非常に困っています。

前の画面でこのコードを書いています。

@IBAction func nextButton(){ praiseTag = "aa" ud.set(praiseTag, forKey: "Tag") //画面遷移をする performSegue(withIdentifier: "showWord", sender: nil)

補足情報(FW/ツールのバージョンなど)

このページの全体です。

import UIKit import NCMB import KRProgressHUD class PoemViewController: UIViewController { @IBOutlet var praiseTextView: UITextView! var praiseArray = [NCMBObject]() var praiseTag = "" var relaxTag = "" var selectedPraise: NCMBObject! let ud = UserDefaults.standard override func viewDidLoad() { super.viewDidLoad() loadData() // Do any additional setup after loading the view. } func loadData(){ KRProgressHUD.show() let query = NCMBQuery(className: "praise") query?.whereKey("Tag", equalTo: praiseTag) query?.findObjectsInBackground({[self] (results, error) in if error != nil{ print("error") } else { for i in results as! [NCMBObject]{ praiseArray .append(i) } KRProgressHUD.dismiss() selectedPraise = praiseArray.randomElement() praiseTextView.text = selectedPraise.object(forKey: "word")as? String } //データを渡す }) }

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

NCMB は存じませんが、結局は

swift

1for i in results as! [NCMBObject]{ 2 praiseArray .append(i) 3}

results が空っぽで praiseArray に何も追加されておらず randomElement()nil を返されているか、

swift

1selectedPraise = praiseArray.randomElement()

selectedPraise.object(forKey: "word") で適切な値を得られず、as? String によって nil を返されているか、

swift

1praiseTextView.text = selectedPraise.object(forKey: "word")as? String

で最終的に praiseTextView.textnil が入ってしまってます。

UITextViewtextString! 型なので nil を入れられません。nil が入っているとオプショナルな値が入っていると想定して強制的にアンラップする結果、Unexpectedly found nil while implicitly unwrapping an Optional value エラーを引き起こします。


swift

1praiseTextView.text = selectedPraise.object(forKey: "word")as? String

の部分を

swift

1if let word = selectedPraise.object(forKey: "word") as? String { 2 praiseTextView.text = word 3}

のように、String 型の値が得られた場合のみ praiseTextView.text にセットされるようにすると良いと思います。


なぜ results が空っぽなのか、または selectedPraise.object(forKey: "word") で期待する値が得られていないのかは質問の範疇にないので自分で調べてみてください。

投稿2021/09/23 10:20

編集2021/09/23 10:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

goodyogurt

2021/09/23 15:39

丁寧にご回答ありがとうございます! しかし、その通りにやってみても全く同じエラーが出てしまいました、、、 厚かましくて申し訳ありませんが、何か他の方法はないでしょうか?
退会済みユーザー

退会済みユーザー

2021/09/23 16:02

あー、`selectedPraise` が `nil` かもしれないので `if let word = selectedPraise?.object(forKey: "word") as? String { ...` のように?マークつけないといけないかもですね。それで動くようなら後で回答も修正しておきますがどうでしょうか。
goodyogurt

2021/09/23 17:01

動きませんでした、、、、
退会済みユーザー

退会済みユーザー

2021/09/23 18:55

んー、あとは `selectedPraise` に `nil` になる可能性があるのに `var selectedPraise: NCMBObject!` で強制アンラップにしてるからじゃないですかね。`nil` が入りそうな変数の型には `?` をつけてオプショナルにします。 `var selectedPraise: NCMBObject?`
退会済みユーザー

退会済みユーザー

2021/09/23 18:57

すいませんね。手元で動かす環境が作れず質問文を読んで目についた所を挙げてるので…………
goodyogurt

2021/09/24 03:38

やってみましたら、optional valueのエラーは無くなったのですが、textviewになにも表示されませんでした。 そうですよね、手元にないと難しいですよね、、、ご協力していただきありがとうございます????
退会済みユーザー

退会済みユーザー

2021/09/24 06:54

そのtextViewに何も表示されないというのが回答の最後にある「なぜ results が空っぽなのか、または selectedPraise.object(forKey: "word") で期待する値が得られていないのかは質問の範疇にないので自分で調べてみてください。」のことなんですが…………
退会済みユーザー

退会済みユーザー

2021/09/24 06:58

こうやってエラーを解決してそのコメントが出てくるというこは、何がエラーの原因で何を直していたのか全く理解してもらえてなかったんですね。残念です
goodyogurt

2021/09/24 15:45

構造が全然理解できていなくて、回答の最後にあることについて調べてみたのですがうまく出てこず、混乱していました。 せっかくここまでお力になってくださったのに不快にさせてしまって申し訳ありませんでした。もう一度調べて考え直してみます。
退会済みユーザー

退会済みユーザー

2021/09/24 16:34

マルチポストするのであればその旨を明記してリンク先を掲載することになっています。 https://teratail.com/help#posted-otherservice 表題のエラー自体は解決したとしてマルチポスト先は新しい質問内容だと認識されているのであれば、こちらの質問はきちんとクローズしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問