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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

1215閲覧

swift 戻り値が思い通り返せない

ttah

総合スコア35

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/04/18 08:08

戻り値がある関数内で、初期値がnilのプロパティ(imageURL)を設定し、
後にそのプロパティに値を代入したのですが、戻り値が初期値(nil)のまま返ってしまいます

どうすれば代入した値を返せるでしょか?

swift

1 2extension.swift 3 4 func setStorage(icon: UIImage, ref: StorageReference) -> String { 5 6 var imageURL: String? 7 ↑この値がnilのまま返ってしまう 8 9 10 if let imageData = icon.pngData() { 11 ref.putData(imageData, metadata: nil){ (metadata, error)in 12 13 guard metadata != nil else { return } 14 ref.downloadURL { (url, error) in 15 guard let downloadURL = url else { return } 16 imageURL = downloadURL.absoluteString 17 18 ↑この値(downloadURL.absoluteString)を返したい。 19 (ここのimageURLはnilではないのを確認済み) 20 21 } 22 } 23 } 24 return imageURL ?? "nil" 25} 26 27

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/18 09:22 編集

func setStorage(icon: UIImage, ref: StorageReference) -> String そもそもnilが帰らないですが
guest

回答1

0

ベストアンサー

imageURL = downloadURL.absoluteStringはクロージャの中で代入しているようですが、このクロージャの処理が終わらないうちにreturn imageURL ?? "nil"を実行していると思います。

クロージャ内部の処理は非同期のことが多いので、それを考慮した構造にする必要があります。

投稿2020/04/18 08:29

TsukubaDepot

総合スコア5086

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

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

ttah

2020/04/20 11:29

TsukubaDepot様回答ありがとうございます 回答のおかげで原因を理解することができたのですが 解決方法が分からずっと調べていたのでお返事遅くなりました 関数(setStorage)の引数にクロージャを設定し後でクロージャで処理した結果を取り出すという方法を 試していたのですが取り出す事が今できない状態です ``` func setIconStorage(icon: UIImage, ref: StorageReference, complete: (String) -> ()) { var imageURL: String? if let imageData = icon.pngData() { ref.putData(imageData, metadata: nil) { (metadata, error) in guard metadata != nil else { return } ref.downloadURL { (url, error) in guard let downloadURL = url else { return } imageURL = downloadURL.absoluteString } } complete(imageURL ?? "") } } ``` 上のimageURLの取り出しからが分からない? そもそも上記の方法であっているのでしょうか? もしあっていたとしたら取り出す方法をお教え頂く事は可能でしょうか?
TsukubaDepot

2020/04/20 13:27 編集

大丈夫だと思います。 取り出し方は難しくなく、setIconStrage を呼び出すときにクロージャとして渡してあげれば大丈夫です。 たとえば、単にimageURL の値を表示するのであれば setIconStrage(icon: [Iconの画像], ref: [リファレンス?], complete: { url in print(url) }) みたいな感じです。 setIconStorage 内部でもクロージャが2回使われているので、これと同じように考えれば大丈夫だと思います。
ttah

2020/04/21 09:41

ありがとうございます無事取り出せました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問