2017-10-15 7 views
0

内の別の関数内で呼んでいる関数から定数を使用しますピッカーコントローラ。は、私は別の関数から変数にアクセスしようとしているが、これはイメージであるため、パラメータが適切であろうと、私は定数を渡すことはないと思うスウィフト

//Get metadata from a photo. Save location (latitude/longitude) to a dictionary. 
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    // Add delegate 
    let picker = UIImagePickerController() 
    picker.delegate = self 


    if let URL = info[UIImagePickerControllerReferenceURL] as? URL { 
     print("We got the URL as \(URL)") 
     let opts = PHFetchOptions() 
     opts.fetchLimit = 1 
     let assets = PHAsset.fetchAssets(withALAssetURLs: [URL], options: opts) 
     for assetIndex in 0..<assets.count { 
     var asset = assets[assetIndex] 
     let opts = PHFetchOptions() 
     opts.fetchLimit = 1 
     let assets = PHAsset.fetchAssets(withALAssetURLs: [URL], options: opts) 
     for assetIndex in 0..<assets.count { 
      var asset = assets[assetIndex] 
      var location = String(describing: asset.location!) 
      var photoLatitude = asset.location?.coordinate.latitude 
      var photoLongitude = asset.location?.coordinate.longitude 
      //var coords : [String: Double] = ["longitude": photo_longitude!, "latitude": photo_latitude!] 
      PHAsset.fetchAssets(withALAssetURLs: [URL], options: nil) 
      dismiss(animated:true, completion: nil) 
      print(photoLatitude) 
      print(photoLongitude) 
      getAddressFromGoogle(lat: photoLatitude!, long: photoLongitude!) 


      } 
     } 
    } 
} 

そして、ここで私は必要な定数含む関数です:

// Create function to get an address from Google from latitude/longitude. 
    func getAddressFromGoogle(lat: Double, long: Double) { 
     let numberFormatter = NumberFormatter() 
     numberFormatter.maximumFractionDigits = 6 
     let textLat = numberFormatter.string(from: NSNumber(value: lat)), textLong = numberFormatter.string(from: NSNumber(value: long)) 
     let completeUrl = baseUrl + textLat! + "," + textLong! + urlSuffix 
     Alamofire.request(completeUrl, method: .get).responseJSON { 
      response in 
      if response.result.isSuccess { 
       print("Successful request.") 

       var locationData = JSON(response.result.value!) 
       // Parse the result for "formatted_address" inside of the entire results block 
       let streetAddress = locationData["results", 0, "formatted_address"] 
       print(streetAddress) 
       print(completeUrl) 


      } 

      else { 
       print("Error \(response.result.error)") 

      } 
     } 

    } 

私は私のイメージピッカーコントローラにstreetAddress定数へのアクセス権を与えたいとここに私はに定数を渡したいコードです。 Swiftでこれにアプローチする最善の方法は何ですか?

+1

あなたは、私が完成 'にパラメータを変更しなければならなかった、この目的のために – 3stud1ant3

答えて

1

私は非同期側に悪いです。ですから、このようなあなたのfunc getAddressFromGoogle(lat: Double, long: Double, completion: @escaping ([String]) -> Void)のパラメータとして完成ブロックの閉鎖を追加する必要があります。

func getAddressFromGoogle(lat: Double, long: Double, completion: @escaping ([String]) -> Void) { 
let numberFormatter = NumberFormatter() 
numberFormatter.maximumFractionDigits = 6 
let textLat = numberFormatter.string(from: NSNumber(value: lat)), textLong = numberFormatter.string(from: NSNumber(value: long)) 
let completeUrl = baseUrl + textLat! + "," + textLong! + urlSuffix 
Alamofire.request(completeUrl, method: .get).responseJSON { 
    response in 
    if response.result.isSuccess { 
     print("Successful request.") 

     var locationData = JSON(response.result.value!) 
     let streetAddress = locationData["results", 0, "formatted_address"] 
     //Here is calling completion block handler to indicate that the treatment is over 
     completion(streetAddress) 
    } 
    else { 
     print("Error \(response.result.error)") 
    } 
    } 
} 

それはあなたのピッカーコントローラ機能で、この機能を呼び出すための時間だとき、あなたはこのような何かをする必要があります:

getAddressFromGoogle(lat: photoLatitude!, long: photoLongitude!, completion: 
    {(streetAddress) in 

    }) 

これで、完了ハンドラで以前渡した定数にアクセスできます。角括弧なしで、「>ボイド - @escaping(文字列):

+0

完了ハンドラ/コールバックを使用することができます。私はまた、クロージャ内でアクセスする前にstreetAddressを文字列に変換しなければなりませんでした。それとは別に、これは素晴らしい解決策です。助けてくれてありがとう。 – vipertherapper

+0

よろしくお願いします。この完成ハンドラーモデルを覚えておいてください – Arrabidas92

0

定数はブロック内で定義されているため、同じブロックの外側には表示されません。 アクセスする必要のある関数を埋め込んだレベル(getAddressFromGoogleおよびimagePickerController)で定義できます。

let streetAddress = ... 
func imagePickerController { 
    ... 
} 
func getAddressFromGoogle(lat: Double, long: Double) { 
    ... 
} 
関連する問題