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

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回答

1987閲覧

[Swift]非同期処理で戻り値を返したい

bananafish

総合スコア65

iOS

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

Swift

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

0グッド

1クリップ

投稿2017/08/09 10:12

Swift

1func getLocation(latitude: CLLocationDegrees,longitude: CLLocationDegrees) { 2 let location = CLLocation(latitude: latitude, longitude: longitude) 3 CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)-> Void in 4 5 guard let place = placemarks?.first else { return } 6 7 //この値をgetLocationメソッドの戻り値として返したい 8 let returnVal = place.postalCode 9 }) 10}

上記の用に緯度と経度を引数に入れ、郵便番号を返すメソッドを作りたいのですが
このような場合はどう実装すればいいのでしょうか

戻り値の郵便番号はバックグラウンドの処理で使用します

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそも非同期処理なので、無理やり同期処理のように戻り値を返すのはあまりオススメしません、むしろ getLocation をクロージャーで処理するのはいかがでしょうか?

swift

1func getLocation(latitude: CLLocationDegrees,longitude: CLLocationDegrees, completion: ((String?) -> Void)?) { 2 let location = CLLocation(latitude: latitude, longitude: longitude) 3 CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)-> Void in 4 5 let place = placemarks?.first 6 completion?(place?.postalCode) 7 }) 8}

使うときは

swift

1getLocation(latitude: latitude, longitude: longitude) { postalCode in 2 if let postalCode = postalCode { 3 //やりたい処理 4 } 5}

どうしても戻り値で返したい場合は semaphore を使えばできないことはないが…場合によってはデッドロックがかかることになりますので

swift

1func getLocation(latitude: CLLocationDegrees, longitude: CLLocationDegrees) -> String? { 2 3 let location = CLLocation(latitude: latitude, longitude: longitude) 4 var postalCode: String? 5 6 let semaphore = DispatchSemaphore(value: 0) 7 CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)-> Void in 8 let place = placemarks?.first 9 postalCode = place?.postalCode 10 semaphore.signal() 11 }) 12 semaphore.wait(timeout: .now() + .seconds(60)) // 60秒経っても結果がなかったら nil を返す 13 14 return postalCode 15 16}

投稿2017/08/09 10:21

編集2017/08/09 10:32
lovee

総合スコア92

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

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

bananafish

2017/08/09 11:02

ありがとうございます、クロージャーでの処理でうまくいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問