いいえこれは分かりません。私は前方ジオコーディングのためのいくつかのコードを書いている、私はUITextFieldをあなたが都市の名前を書くと、それが解雇され、同時にUITextFieldが有効な入力が含まれているかどうかを判断するために呼び出されるエンターボタンを押した。エラーがあれば、bool変数に保存され、その値は関数内で変更されます。私はどこにでもprint文を持っていますが、コンソール出力から関数がif条件の後に実行されたことがわかりますが、前に呼び出されています...何ですか?誰かが何が起こっているか私に説明できますか?コード:前に呼び出されていても、コードのブロックの後に関数が実行される
var locationError: Bool?
func textFieldShouldReturn(textField: UITextField) -> Bool {
self.view.endEditing(true)
forwardGeocoding(textField.text!)
print("forward geocoding ran 1st time")
print(locationError)
if locationError == true {
print("Error")
} else if locationError == false {
print("Success")
} else if locationError == nil {
print("No value for locationError")
}
return false
}
func forwardGeocoding(address: String) -> CLLocation? {
var userLocation: CLLocation?
CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
if error != nil {
print("Geocoding error: \(error)")
self.locationError = true
return
}
if placemarks?.count > 0 {
print("Placemark found")
self.locationError = false
let placemark = placemarks?.first
let location = placemark?.location
let coordinate = location?.coordinate
print("Settings location: \(coordinate!.latitude), \(coordinate!.longitude)")
if let unwrappedCoordinate = coordinate {
let CLReadyLocation: CLLocation = CLLocation(latitude: unwrappedCoordinate.latitude, longitude: unwrappedCoordinate.longitude)
userLocation = CLReadyLocation
}
}
})
return userLocation
}
コンソール出力:
forward geocoding ran 1st time
nil
No value for locationError
Placemark found
Settings location: 48.8567879, 2.3510768
これは部分的には私の考えですが、その理由は、関数内のコードがクロージャ内にあり、それが残りのコードと非同期に実行されるためです。関数内のuserLocation変数の上にプリントを置いて、何が起こるかを見てください。 –
'placemarks'とは何ですか?それは配列ですか? – Dershowitz123