CoreLocationを使用してユーザーの現在の場所(文字列)を取得するクラスUserLocation(以下)を作成しました&緯度と経度APIに渡す)。続行する前にオブジェクトのインスタンス化を待つように強制します
私のコードは動作しますが、クラスを初期化するとき、残りのコードはinitが終了するのを待たずに移動しますので、私は位置関係の値を割り当てることができません検索しようとしています。
これは妥当なアプローチですか(そうでなければ、もう少し "MVC"組織について考える必要があります)、そうであれば、どのようにして初期化(場所が見つかる&逆ジオコーディング)移動する前に。クラスのinitで指定されている@エスケープクロージャのような初期化の下にコードを置く方法はありますか?あなたの親切なアドバイスに感謝しています。これは必ずしもスウィフト問題ではありません
import Foundation
import CoreLocation
class UserLocation {
var place = ""
var coordinates = ""
let locationManager = CLLocationManager()
var currentLocation: CLLocation!
init() {
returnResults()
}
func returnResults() {
getUserLocation { placemark in
if placemark != nil {
self.place = (placemark?.name)!
self.coordinates = "\((placemark?.location?.coordinate.latitude)!),\((placemark?.location?.coordinate.longitude)!)"
} else {
print("Error retrieving placemark")
}
}
}
func getUserLocation(completion: @escaping (CLPlacemark?) ->()) {
var placemark: CLPlacemark?
locationManager.requestWhenInUseAuthorization()
if (CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse ||
CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways) {
currentLocation = locationManager.location
let geoCoder = CLGeocoder()
geoCoder.reverseGeocodeLocation(currentLocation) { (placemarks, error) -> Void in
if error != nil {
print("Error getting location: \(error)")
placemark = nil
} else {
placemark = placemarks?.first
}
completion(placemark)
}
}
}
}
extension CLPlacemark {
var cityState: String {
var result = ""
switch (self.locality, self.administrativeArea, self.country) {
case (.some, .some, .some("United States")):
result = "\(locality!), \(administrativeArea!)"
case (.some, _ , .some):
result = "\(locality!), \(country!)"
default:
result = name ?? "Location Unknown"
}
return result
}
}
大変感謝しています。構文の非常に明確な説明。とても有難い! – Gallaugher
@Gallaugherがうれしい – Cristik