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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

821閲覧

selectedUserがnilで、Unexpectedly found nilエラー

kazuki_user

総合スコア147

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2020/09/10 01:27

編集2020/09/10 03:02

## 画面遷移するとき、Unexpectedly found nilエラー。

  • selectedUsernil
  • テキストデータを、Modelに格納して、ProfileDetailVCで表示したい。
  • struct{static let}以外に有効な方法があれば、教えて頂きたいです。
  • 他の箇所にエラーはありません。

## エラー

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

Outlet接続のエラーと考えたのですが、接続は正常な気がします..
間違った箇所があれば、ご指摘ください。

イメージ説明
イメージ説明

## コード

Model

1 2import UIKit 3 4let URL_BASE = "https://api.github.com/search/repositories?q=" 5var selectedUser = SearchRootVC() 6let repo = selectedUser.repo[selectedUser.RepoToPass] // Unexpectedly found nil while implicitly unwrapping an Optional value 7 8struct Segues { 9 // static let ... 自動的に遅延初期化される(初回アクセスのタイミングでインスタンス生成) 10 static let ToProfileDetail = "Detail" 11} 12 13struct Identifiers { 14 static let RepositoryCell = "Repository" 15} 16 17struct ApiKey { 18 static let Language = "language" 19 static let Stars = "stargazers_count" 20 static let Watchers = "wachers_count" 21 static let Forks = "forks_count" 22 static let Issues = "open_issues_count" 23 static let FullName = "full_name" 24 static let User = "owner" 25 static let imgUrl = "avatar_url" 26} 27 28struct repoTxt { 29 static let language = "Written in (repo["language"] as? String ?? "")" 30 static let stars = "(repo["stargazers_count"] as? Int ?? 0) stars" 31 static let watchers = "(repo["wachers_count"] as? Int ?? 0) watchers" 32 static let forks = "(repo["forks_count"] as? Int ?? 0) forks" 33 static let issues = "(repo["open_issues_count"] as? Int ?? 0) open issues" 34} 35

ProfileDetailVC

1import UIKit 2 3class ProfileDetailVC: UIViewController { 4 5 @IBOutlet weak var ImgView: UIImageView! 6 7 @IBOutlet weak var TitleLbl: UILabel! 8 9 @IBOutlet weak var LanguageLbl: UILabel! 10 11 @IBOutlet weak var StarsLbl: UILabel! 12 @IBOutlet weak var WatchersLbl: UILabel! 13 @IBOutlet weak var ForksLbl: UILabel! 14 @IBOutlet weak var IssuesLbl: UILabel! 15 16 // Var 17 var selectedUser: SearchRootVC! 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 setupUI() // Repository型の変数を渡す 22 getProfileImage() 23 } 24 25// func setupUI() { 26// TitleLbl.text = repo[ApiKey.FullName] as? String 27// LanguageLbl.text = repoTxt.language 28// StarsLbl.text = repoTxt.stars 29// WatchersLbl.text = repoTxt.watchers 30// ForksLbl.text = repoTxt.forks 31// IssuesLbl.text = repoTxt.issues 32// } 33 34 func setupUI() { 35 36 let repo = selectedUser.repo[selectedUser.RepoToPass] 37 38 TitleLbl.text = repo[ApiKey.FullName] as? String 39 LanguageLbl.text = repo[repoTxt.language] as? String 40 StarsLbl.text = repo[repoTxt.stars] as? String 41 WatchersLbl.text = repo[repoTxt.watchers] as? String 42 ForksLbl.text = repo[repoTxt.forks] as? String 43 IssuesLbl.text = repo[repoTxt.issues] as? String 44 } 45 46 func getProfileImage() { 47 48 let repo = selectedUser.repo[selectedUser.RepoToPass] 49 50 guard let user = repo[ApiKey.User] as? [String: Any], 51 let imgURL = user[ApiKey.imgUrl] as? String, 52 let url = URL(string: imgURL) 53 else { return } 54 55 let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 56 57 guard error == nil else { 58 debugPrint(error.debugDescription) 59 return 60 } 61 62 guard let data = data else { return } 63 64 let img = UIImage(data: data) 65 DispatchQueue.main.async { 66 self.ImgView.image = img 67 } 68 } 69 task.resume() 70 } 71} 72

質問は以上です。
お時間あるときに、ご返信頂けましたら幸いです????

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

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

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

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

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

TsukubaDepot

2020/09/10 01:34

> var selectedUser: SearchRootVC! > let repo = selectedUser.repo[selectedUser.RepoToPass] この二行は連続して記述(つまり、実行)しているのでしょうか。
kazuki_user

2020/09/10 02:26 編集

以下のように、連続して記述はしていませんでした。 連続させてみましたが、同じくエラーが出ました。????‍♂️ var selectedUser: SearchRootVC! let URL_BASE = "https://api.github.com/search/repositories?q=" let repo = selectedUser.repo[selectedUser.RepoToPass] 尚、selectedUserがnilなのがエラーの原因なようです。
MasakiHori

2020/09/10 02:42

ソースコードが断片的過ぎて原因がわかりません 全部提示して
guest

回答1

0

ベストアンサー

別の回答でも申し上げましたが、応用よりまずは基礎をしっかり押さえたほうがいいかと思います。

Implicitly Unwrapped Optional (日本語だと、有値オプショナル型、暗黙的開示オプショナル型とかいろいろ呼び名があるようです)は、端的にいえば初期値は nil だが、実際には何らかのインスタンスが代入されることが期待されるオプショナル型です。

別の回答者の回答にもありましたが、その振る舞いを十分に理解していないのであれば、安易にImplicitly Unwrapped Optional は使うべきではないと思いますし、その意見に同意します。

Swift

1var selectedUser: SearchRootVC! 2// 以下letでエラー。 3let repo = selectedUser.repo[selectedUser.RepoToPass] // Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

初期値が nil のプロパティのプロパティを参照したり、nilのままである辞書(と思われるプロパティ)を参照しようとしているので当然実行時エラーとなってしまいます。

投稿2020/09/10 02:41

TsukubaDepot

総合スコア5086

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

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

kazuki_user

2020/09/10 03:04

初歩の質問で恐縮ですが.. Implicitly Unwrapped Optional は使わない場合、 var selectedUser: SearchRootVC!はどのような記述に変更すれば良いのでしょうか?
TsukubaDepot

2020/09/10 03:06

var selectedUser = SearchRootVC() という具合に、具体的にインスタンスを作れば nil にはなりませんが、その一方 selectedUser.RepoToPass などに正確に値が入っているか否かは全くわからない(SearchRootVC の作りを見ないとわかならい)ので、いずれ何らかのエラーが出ることは容易に想像できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問