Realmの初期データを作り、最初はプロフィール画像がないためアセットの画像を表示し、プロフィール設定した後には画像をUIImageに変換し表示しようと考えました。ビルドすると何もエラーは出てこないのですが、いざ実行すると、アンラップしろと出てきました。UserクラスではprofileImageはnilとし、Objectを継承するとオプショナルなのでアンラップする必要はないはずです。
なんだか矛盾しているのでよく分からない状態でございます。
コード読んでない段階で、素朴な疑問なんだけど、これ何がnilなの?
(user or profileImage)
UserのprofileImageです。
申し訳ないんだけど、プリントデバッグしてコンソールの表示を教えてくれませんか?
赤くなってる上の行に
print(“user: \(user as Any)”)
> オプショナルなのでアンラップする必要はないはず
理解されてこう書いてますか?書き間違いですか?
やってみました。
initUserData: Results<User> <0x7ffd72d08ee0> (
[0] User {
id = 0;
fullname = fullname;
username = anonymous;
profileText = Let's introduce yourself!;
profileImage = <(null) — 0 total bytes>;
}
)
2020-07-04 23:17:18.716860+0900 TweetMemo[1526:85094] [Storyboard] Unknown class _TtC9TweetMemo14ViewController in Interface Builder file.
2020-07-04 23:17:18.723955+0900 TweetMemo[1526:85387] Version 5.2.0 of Realm is now available: https://github.com/realm/realm-cocoa/blob/v5.2.0/CHANGELOG.md
file:///Users/Newton/Library/Developer/CoreSimulator/Devices/6C1A834E-A413-4B6E-BFAF-E7F07321B68F/data/Containers/Data/Application/F205D7BA-D48E-47D9-94FF-4D220461EAD9/Documents/default.realm
user: nil
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file /Users/Newton/Documents/App/TweetMemo/TweetMemo/Controller/FeedController.swift, line 83
2020-07-04 23:17:18.899772+0900 TweetMemo[1526:85094] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file /Users/Newton/Documents/App/TweetMemo/TweetMemo/Controller/FeedController.swift, line 83
user: nilってかいてあるよ。
例えると、購入していないパソコンのメモリを交換しようとしてる状態なんだけど、まだ購入していない手元にないパソコンのメモリを自分の手で交換できると思う?
まとめとくね。
私が聞いているのは、nilなのは(user or profileImage)のどっち?
あなたがnilだと言っているのはUserのprofileImage
この時点で話が噛み合ってなかったんだけど、
あなたが触ってるのはuserなのね。
だからprintしてもらったんだけど、Xcodeがuserはnilですって言ってるわけね。
でメモリ交換の例えになるわけ。
guard let でアンラップしたらビルドには成功できたのですが、今度は何も表示しなくなりボタンも無効になってしまいました。
func configureLeftBarButton(){
guard let user = user else { return }
if user.profileImage != nil {
print("user: \(user as Any)")
print("userProfileImage: \(user.profileImage as Any)")
let pngData = profileImage?.toPNGData()
let jpegData = profileImage?.toJPEGData()
let profileImageView = UIImageView()
user.profileImage = pngData ?? jpegData
profileImageView.image = UIImage(data: user.profileImage!)
profileImageView.setDimensions(width: 32, height: 32)
profileImageView.layer.cornerRadius = 32 / 2
profileImageView.layer.masksToBounds = true
profileImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(handleProfileImageTap))
profileImageView.addGestureRecognizer(tap)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: profileImageView)
} else {
let profileImageView = UIImageView()
profileImageView.image = UIImage(named: "placeholderImg")
profileImageView.setDimensions(width: 32, height: 32)
profileImageView.layer.cornerRadius = 32 / 2
profileImageView.layer.masksToBounds = true
profileImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(handleProfileImageTap))
profileImageView.addGestureRecognizer(tap)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: profileImageView)
}
}
…。当然な結果と思いませんか?
購入してないパソコンを箱から出せますか?
基礎を見直すと解決できます。
回答1件
あなたの回答
tips
プレビュー