2017-11-21 9 views
0

(、スウィフトの場所をグーグル)私のカスタムクラスには、私は今、私が追加したい、(私はGoogleの場所で働いている)場所の詳細を取得し、このクラスでは

import UIKit 
import CoreLocation 

private let geometryKey = "geometry" 
private let locationKey = "location" 
private let latitudeKey = "lat" 
private let longitudeKey = "lng" 
private let nameKey = "name" 
private let openingHoursKey = "opening_hours" 
private let openNowKey = "open_now" 
private let vicinityKey = "vicinity" 
private let typesKey = "types" 
private let photosKey = "photos" 

class QPlace: NSObject { 

    var location: CLLocationCoordinate2D? 
    var name: String? 
    var photos: [QPhoto]? 
    var vicinity: String? 
    var isOpen: Bool? 
    var types: [String]? 

    init(placeInfo:[String: Any]) { 
     // coordinates 
     if let g = placeInfo[geometryKey] as? [String:Any] { 
      if let l = g[locationKey] as? [String:Double] { 
       if let lat = l[latitudeKey], let lng = l[longitudeKey] { 
        location = CLLocationCoordinate2D.init(latitude: lat, longitude: lng) 
       } 
      } 
     } 

     // name 
     name = placeInfo[nameKey] as? String 

     // opening hours 
     if let oh = placeInfo[openingHoursKey] as? [String:Any] { 
      if let on = oh[openNowKey] as? Bool { 
       isOpen = on 
      } 
     } 

     // vicinity 
     vicinity = placeInfo[vicinityKey] as? String 

     // types 
     types = placeInfo[typesKey] as? [String] 

     // photos 
     photos = [QPhoto]() 
     if let ps = placeInfo[photosKey] as? [[String:Any]] { 
      for p in ps { 
       photos?.append(QPhoto.init(photoInfo: p)) 
      } 
     } 
    } 

    func getDescription() -> String { 

     var s : [String] = [] 

     if let name = name { 
      s.append("\(name)") 
     } 

     if let vicinity = vicinity { 
      s.append("Vicinity: \(vicinity)") 
     } 

     if let types = types { 
      s.append("Types: \(types.joined(separator: ", "))") 
     } 

     if let isOpen = isOpen { 
      s.append(isOpen ? "OPEN NOW" : "CLOSED NOW") 
     } 

     return s.joined(separator: "\n") 
    } 

    func heightForComment(_ font: UIFont, width: CGFloat) -> CGFloat { 
     let desc = getDescription() 
     let rect = NSString(string: desc).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 
     return ceil(rect.height) 
    } 


} 

を場所のウェブサイトとの価格レベルを追加します。また、ウェブサイトと価格レベルが、私はどのように行うかわからない、私は文書で見てhttps://developers.google.com/places/web-service/detailsandは自分で追加しようとしたが、私は彼らが働くようにすることはできません。例えば、ウェブサイトでは、私はこの形式でそれを追加しようとしましたvar website: URL?そしてこのvar website: String?の両方では動作しません。では、私のクラスにこれらの場所の詳細を追加するにはどうすればいいですか?これがnilを印刷した場合

あなたに

import Foundation 
import UIKit 
import CoreLocation 
import Alamofire 

class NearbyPlaces { 
    static func getCategories() -> [QCategoryy] { 
     let list:[QCategoryy] = [QCategoryy(name: "bar", image: UIImage(named: "bar_button.png")!), QCategoryy(name :"night_club", image: UIImage(named: "nightclub_button.png")!), QCategoryy(name: "restaurant", image: UIImage(named: "restaurant_button.png")!), QCategoryy(name: "gym", image: UIImage(named: "gym_button.png")!), QCategoryy(name: "spa", image: UIImage(named: "spa_button.png")!), QCategoryy(name: "museum", image: UIImage(named: "museum_button.png")!)] 
     return list 
    } 

    static let searchApiHost = "https://maps.googleapis.com/maps/api/place/nearbysearch/json" 
    static let googlePhotosHost = "https://maps.googleapis.com/maps/api/place/photo" 
    static let detailsApiHost = "https://maps.googleapis.com/maps/api/place/details/json" 

    static func getNearbyPlaces(by category:String, coordinates:CLLocationCoordinate2D, radius:Int, token: String?, completion: @escaping (QNearbyPlacesResponse?, Error?) -> Void) { 

     var params : [String : Any] 

     if let t = token { 
      params = [ 
       "key" : AppDelegate.googlePlacesAPIKey, 
       "pagetoken" : t, 
      ] 
     } else { 
      params = [ 
       "key" : AppDelegate.googlePlacesAPIKey,  
       "radius" : radius, 
       "location" : "\(coordinates.latitude),\(coordinates.longitude)", 
       "type" : category.lowercased() 
      ] 
     } 

     Alamofire.request(searchApiHost, parameters: params, encoding: URLEncoding(destination: .queryString)).responseJSON { response in 

      if let error = response.error { 
       completion(nil, error) 
      } 
      if let response = QNearbyPlacesResponse(dic : response.result.value as? [String : Any]) { 
       completion(response, nil) 
      } 
      else { 
       completion(nil, QNearbyPlacesResponseError.noParsingDone) 
      } 
     } 
    } 

    static func googlePhotoURL(photoReference:String, maxWidth:Int) -> URL? { 
     return URL.init(string: "\(googlePhotosHost)?maxwidth=\(maxWidth)&key=\(AppDelegate.googlePlacesAPIKey)&photoreference=\(photoReference)") 
    } 
} 

enum QNearbyPlacesResponseError : Error { 
    case noParsingDone 
} 


struct QNearbyPlacesResponse { 
    var nextPageToken: String? 
    var status: String = "NOK" 
    var places: [QPlace]? 

    init?(dic:[String : Any]?) { 
     nextPageToken = dic?["next_page_token"] as? String 

     if let status = dic?["status"] as? String { 
      self.status = status 
     } 

     if let results = dic?["results"] as? [[String : Any]]{ 
      var places = [QPlace]() 
      for place in results { 
       places.append(QPlace.init(placeInfo: place)) 
      } 
      self.places = places 
     } 
    } 

    func canLoadMore() -> Bool { 
     if status == "OK" && nextPageToken != nil && nextPageToken?.characters.count ?? 0 > 0 { 
      return true 
     } 
     return false 
    } 



} 
+0

GooglePlacesフレームワークを使用しましたが、これを使用する場合はGMSPlacesPriceLevelを使用して価格を設定してください。 –

答えて

0

が関数initをUPDATE、他のあなたは必要なタイプを得るでしょう、そして、あなたが何か間違ったことをやっている、

print(placeInfo["website"]) 

を試してみてください。さらに、placeInfo ["website"]をそのタイプに下げる必要があります。ほとんどの場合、文字列型になります。

// In declaration 
var website: String? 
// In init 
website = placeInfo["website"] as? String 

これは動作するはずです。

最後に、APIを使用してデータを取得しているようですが、最後に、クラス参照へのリンクが用意されています。

編集(コメントの後): -

使用しているAPIは、あなたが求めて情報を提供していません。情報を得るには、this APIを使用する必要があります。呼び出すAPIのIDを取得していますが、詳細APIを呼び出す必要があります。

これがあなたの問題を解決することを願っています。

+0

はいprint nil – arc4Random

+0

キーを取得した場所のリンクを提供できますか? –

+0

はい、私はこのプロジェクトで試していますhttps://github.com/bilalbhutta/IOSNearbyPlaces – arc4Random

関連する問題