2017-11-10 5 views
0

新参者です.Google API Nearby Searchを使用しています。私は閉鎖にカプセル化されたデータを送信する問題を抱えていますが、すでに入力された近傍の情報を持つテーブルですが、closureにplaceID情報を送信して詳細を取得しようとすると、閉鎖時にカプセル化データを管理する

ここで私はplaceIDと近傍を取得し、その後にplaceViewをtableViewに配置します。クラスプレイスは別々のスウィフトファイルにあり、関数downloadPlaceIDはViewController内にあります。

class Place { 

    var placeId: String! 
    var vicinity: String! 

    var _placeId: String { 
     if placeId == nil { 
      placeId = "" 
     } 
     return placeId 
    } 

    var _vicinity: String { 
     if vicinity == nil { 
      vicinity = "" 
     } 
     return vicinity 
    } 


    init(place: [String:Any]) { 

     if let ids = place["id"] as? String { 
      self.placeId = ids 

     } 

     if let vicinities = place["vicinity"] as? String { 
      self.vicinity = vicinities 

     } 

    } 

} 


func downloadPlaceID (completed: @escaping DownloadComplete) { 

     let placeURL = URL(string: nearbyURL) 

     Alamofire.request(placeURL!).responseJSON { (response) in 
      let result = response.result 

      if let dictionary = result.value as? [String:Any] { 
       if let results = dictionary["results"] as? [[String:Any]] { 

        if let status = dictionary["status"] as? String { 
         if status == "OK" { 
          for obj in results { 
           place = Place(place: obj) 
           // here i get all the placeID's 
           places.append(place) 
          } 
         } 
        } 
       } 
      } 
      completed() 
     } 
    } 

は、その後、私は私がplaceIDを入れてその中に詳細を取得しよう:

func downloadDetails(input: String, completed: DownloadComplete) { 

     let details = "\(detailsBaseURL)\(detailsPlaceId)\(input)\(detailsKey)\(detailsSearchAPIKey)" 
     print(placeID) 

     Alamofire.request(details).responseJSON { response in 
      let result = response.result 

      if let dictionary = result.value as? [String:Any] { 

       if let result = dictionary["result"] as? [String:Any] { 

        if let phoneNumber = result["formatted_phone_number"] as? String { 
         self.phone = phoneNumber 
         print(self.phone!) 
        } 

        if let geometry = result["geometry"] as? [String:Any] { 
         if let location = geometry["location"] as? [String:Any] { 
          if let latitude = location["lat"] as? Double { 
           self.lat = latitude 
           print(self.lat!) 
          } 
          if let longitude = location["lng"] as? Double { 
           self.lng = longitude 
           print(self.lng!) 
          } 
         } 
        } 

        if let openingHours = result["opening_hours"] as? [String:Any] { 
         if let openNow = openingHours["open_now"] as? Bool { 
          self.workHours = openNow 
          print(self.workHours!) 
         } 
        } 
       } 
      } 
     } 
    } 

ここで私は詳細を取得するために使用しようとしていることのviewDidLoad内のコードです。 (placeURL誤って作成することができ、要求が失敗する可能性があり、そしていくつかの変数がnilに次のようになります。

override func viewDidLoad() { 
super.viewDidLoad() 


downloadPlaceID { 
    detail.downloadDetails(input: place.placeId, completed: { 

    }) 
} 



} 
+0

の「place_id」である必要がありますあなたは失敗する可能性があります6つの条件を持っています辞書、結果、ステータス)。一番上のブレークダウンを入れて、どれが失敗しているかを確認するために行ごとにデバッグすれば、問題の理解に役立ちます。 –

+0

実際のコードを入力してください。最後の断片はSwiftでも有効ではありません。真ん中の断片は、その中にコメントだけを入れた関数です。最初のフラグメントはどこにも呼び出されません。 – JeremyP

+0

@JeremyP - 実際のコードを書いています。私はplace.idをdownloadPlaceID funcの外に置くことができません。ランダムなplaceIDを置くとplace.placeIDを入れようとするとすべての詳細(電話、住所など)が届きます。 – NikolaS

答えて

0

それは代わりに「ID」

class Place { 

     var placeId: String! 
     var vicinity: String! 

     var _placeId: String { 
      if placeId == nil { 
       placeId = "" 
      } 
      return placeId 
     } 

     var _vicinity: String { 
      if vicinity == nil { 
       vicinity = "" 
      } 
      return vicinity 
     } 


     init(place: [String:Any]) { 

      if let ids = place["place_id"] as? String { 
       self.placeId = ids 

      } 

      if let vicinities = place["vicinity"] as? String { 
       self.vicinity = vicinities 

      } 

     } 

    }