回答編集履歴

1

どうしても戻り値が欲しい場合のやり方追加

2017/08/09 10:32

投稿

lovee
lovee

スコア92

test CHANGED
@@ -41,3 +41,47 @@
41
41
  }
42
42
 
43
43
  ```
44
+
45
+
46
+
47
+ どうしても戻り値で返したい場合は `semaphore` を使えばできないことはないが…場合によってはデッドロックがかかることになりますので
48
+
49
+
50
+
51
+ ```swift
52
+
53
+ func getLocation(latitude: CLLocationDegrees, longitude: CLLocationDegrees) -> String? {
54
+
55
+
56
+
57
+ let location = CLLocation(latitude: latitude, longitude: longitude)
58
+
59
+ var postalCode: String?
60
+
61
+
62
+
63
+ let semaphore = DispatchSemaphore(value: 0)
64
+
65
+ CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)-> Void in
66
+
67
+ let place = placemarks?.first
68
+
69
+ postalCode = place?.postalCode
70
+
71
+ semaphore.signal()
72
+
73
+ })
74
+
75
+ semaphore.wait(timeout: .now() + .seconds(60)) // 60秒経っても結果がなかったら nil を返す
76
+
77
+
78
+
79
+ return postalCode
80
+
81
+
82
+
83
+ }
84
+
85
+ ```
86
+
87
+