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

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

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

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

Swift

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

Q&A

解決済

2回答

1547閲覧

swift4でoptionalのunwrap方法を教えてください。

you555

総合スコア21

iOS

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

Swift

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

0グッド

0クリップ

投稿2019/03/14 00:30

let imagePath = String(describing: UserDefaults.standard.url(forKey: "drawingImage")) print(imagePath) if let image = UIImage(contentsOfFile: imagePath) { let image = UIImageView(image: image) canvasView.image = image.image canvasView.contentMode = UIView.ContentMode.scaleAspectFill }else{ }

このコードを実行するとprint(imagePath)の中身がOptional(file:///var/mobile/Containers/Data/Application/D96685FE-7C71-4243-92EE-EFF0C312311E/Documents/drawing.png)となります。
Optionalをunwrapするために以下のようにソースを変更しました。

let path = String(describing: UserDefaults.standard.url(forKey: "drawingImage")) guard let imagePath = path else { return } print(imagePath) if let image = UIImage(contentsOfFile: imagePath) { let image = UIImageView(image: image) canvasView.image = image.image canvasView.contentMode = UIView.ContentMode.scaleAspectFill }else{ }

するとInitializer for conditional binding must have Optional type, not 'String'guard文のところで、エラーになります。どうしてそのようになるのかわかりません。pathという変数の型はStringでした。
ご教授をお願いします。

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

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

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

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

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

fuzzball

2019/03/14 00:41

なぜ二行に分けたのでしょうか?
you555

2019/03/14 01:59

すいません。意味はないです。試しにコードを書きました。
guest

回答2

0

ベストアンサー

アンラップするものを間違えています。

imagePathがオプショナル型なのではなくUserDefaults.standard.url(forKey: "drawingImage")がオプショナル型です。

あなたも、

pathという変数の型はStringでした

と書いてますよね。オプショナル型ならString?になるはずです。
上のコードのimagePathや下のコードのpathの中身は、Optional(file:///(略)/drawing.png)というただの文字列です。

おまけ

URLからパスを取り出すのはこっちの方がいいです。(というかそっちはダメです)

swift

1if let url = UserDefaults.standard.url(forKey: "drawingImage") { 2 print(url.absoluteString) 3}

投稿2019/03/14 00:50

編集2019/03/14 00:56
fuzzball

総合スコア16731

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

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

you555

2019/03/14 02:00

ありがとうございます。
guest

0

動作確認できていませんが、こんな感じじゃないでしょうかね?

swift

1guard let url = UserDefaults.standard.url(forKey: "drawingImage") else { return } 2guard let imagePath = try? String(contentsOf: url) else { return } 3print(imagePath)

投稿2019/03/14 01:00

takabosoft

総合スコア8356

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

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

you555

2019/03/14 02:00

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問