2017-11-12 9 views
2

私はほとんど質問がありませんでしたが、すべてSwift 2で古いです。 Appleのウェブサイトからこの機能を取得して、都市名を緯度と経度に変換しましたが、関数は(return文の後には何もないので)戻り、何を渡す必要があります。誰かにそれを説明したり、私にそれをどう使うべきかを教えてくれますか?都市名をSwiftの座標に変換

func getCoordinate(addressString : String, 
     completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void) { 
    let geocoder = CLGeocoder() 
    geocoder.geocodeAddressString(addressString) { (placemarks, error) in 
     if error == nil { 
      if let placemark = placemarks?[0] { 
       let location = placemark.location! 

       completionHandler(location.coordinate, nil) 
       return 
      } 
     } 

     completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?) 
    } 
} 

答えて

1

あなたは次のようにそれを行うことができます。

import CoreLocation 

func getCoordinateFrom(address: String, completion: @escaping(_ coordinate: CLLocationCoordinate2D?, _ error: Error?) ->()) { 
    CLGeocoder().geocodeAddressString(address) { placemarks, error in 
     completion(placemarks?.first?.location?.coordinate, error) 
    } 
} 

使用法:

getCoordinateFrom(address: "Rio de Janeiro, Brazil") { coordinate, error in 
    guard let coordinate = coordinate, error == nil else { return } 
    // don't forget to update the UI from the main thread 
    DispatchQueue.main.async { 
     print(coordinate) // CLLocationCoordinate2D(latitude: -22.910863800000001, longitude: -43.204543600000001) 
    } 

} 
1

都市の座標を取得するような非同期操作を行うと、関数の結果として値を返すことはできません。あなたは、電話をかけて、あなたのビジネスについて行って、完了ハンドラを呼び出すのを待つ必要があります。これはパラメータcompletionHandlerが上記のコードに含まれています。結果が準備できたら、実行されるクロージャ(コードブロック)を渡します。

getCoordinate(addressString: someString) { coordinate, error in 
    if error != nil { 
    //display error 
    return 
    } else { 
    //at this point `coordinate ` contains a valid coordinate. 
    //Put your code to do something with it here 
    print("resulting coordinate = (\(coordinate.latitude),\(coordinate.longitude))") 
    } 
} 

スウィフト3では、結果またはエラーを返すのではなく、関数をスローさせることに注意してください。

+0

私は本当にあなたがやったことに感謝、私はちょうど私ので、場所を取得するために都市名を渡すために何をしたい場合ブロックのコードを渡すためにそれをどのように使用するのか分かりません。私が使用する必要がある正確なコードを表示していただきたいと思います。私は感謝します。 – codeDojo

+0

あなたが書いたコードは、説明や実際の機能であるかどうかは分かりませんでしたが、コードに入れようとしましたが、多くのエラーがありました。 – codeDojo

+0

ここでの主な問題は、なぜOPに多くのエラーがあるのか​​を説明する欠落する閉じ括弧です。 CLLocationCoordinate2Dの名前を付けるBtwは誤解を招きます。また、非同期メソッドを呼び出すときには、UIを更新するためにOPをメインスレッドに戻す必要があることを忘れてしまいました。 –

関連する問題