2017-05-22 13 views
0

このコードをチェックアウト:のViewControllerclosure関数に値を渡す

override func viewDidLoad() { 
    var addressInViewController = String() 
    getReversedGeocodeLocation(location: location, completionHandler: { 
     print("After geo finished") 
    }) 
} 

func getReversedGeocodeLocation(location: CLLocation, completionHandler: @escaping()->()) { 
    CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in 

     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 
      return 
     } 

     if placemarks != nil { 
      if placemarks!.count > 0 { 
       let pm = placemarks![0] 
       if let addressDictionary: [AnyHashable: Any] = pm.addressDictionary, 
       let addressDictionaryFormatted = addressDictionary["FormattedAddressLines"] { 
        let address = (addressDictionaryFormatted as AnyObject).componentsJoined(by: ", ") 
        self.addressInViewController = address 
       } 
       completionHandler() 
      } 
     } else { 
      print("Problem with the data received from geocoder") 
     } 
    }) 
} 

を。これは、クロージャを使用するためのシンプルなケースです。ご覧のように、逆ジオが終了すると、関数自体の外で定義されたaddressInViewController変数が更新されます。クロージャについては少し混乱しますが、基本的に別の関数をパラメータとして関数に渡していることはわかります。だから私はアドレス変数がメインの逆ジオ関数から移入されて渡される() - >()の代わりに(_ String:x) - >()のようなものを渡すことができますか?私はそれをやってみましたが、 "x"は定義されていません。これが達成可能な場合は、クロージャを使用してより良い方法でコードをデカップリングすることができます。

おかげで、素晴らしい一日持っている:)

答えて

1

この

func getReversedGeocodeLocation(location: CLLocation, completionHandler: @escaping (_ value : Any)->()) { 
    CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in 

     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 
      return 
     } 

     if placemarks != nil { 
      if placemarks!.count > 0 { 
       let pm = placemarks![0] 
       if let addressDictionary: [AnyHashable: Any] = pm.addressDictionary, 
       let addressDictionaryFormatted = addressDictionary["FormattedAddressLines"] { 
        let address = (addressDictionaryFormatted as AnyObject).componentsJoined(by: ", ") 
        self.addressInViewController = address 
       } 
       completionHandler(address) 
      } 
     } else { 
      print("Problem with the data received from geocoder") 
     } 
    }) 
} 

override func viewDidLoad() { 
    var addressInViewController = String() 
    getReversedGeocodeLocation(location: location, completionHandler: { (_ values : Any) in 
     self. addressInViewController = values 

    }) 
} 

のようなあなたのメソッドを定義するあなたの必要性に応じてValueのデータ型を作成します。

関連する問題