2017-09-26 85 views
0

我被继雷Wenderlich教程创建在我休假的应用程序的一些功能,所以我创建这个类:斯威夫特:类型的值没有成员,不能调用非功能型的价值

import Foundation 
import Foundation 
import CoreLocation 
import SwiftyJSON 

class GoogleDataProvider { 
    var photoCache = [String:UIImage]() 
    var placesTask: URLSessionDataTask? 
    var session: URLSession { 
     return NSURLSession.sharedSession() 
    } 

    func fetchPlacesNearCoordinate(coordinate: CLLocationCoordinate2D, radius: Double, types:[String], completion: (([GooglePlace]) -> Void)) ->() 
    { 
     var urlString = "http://localhost:10000/maps/api/place/nearbysearch/json?location=\(coordinate.latitude),\(coordinate.longitude)&radius=\(radius)&rankby=prominence&sensor=true" 
     let typesString = types.count > 0 ? types.joined(separator: "|") : "food" 
     urlString += "&types=\(typesString)" 
     urlString = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! 

     if let task = placesTask, task.taskIdentifier > 0 && task.state == .Running { 
      task.cancel() 
     } 

     UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
     placesTask = session.dataTaskWithURL(NSURL(string: urlString)!) {data, response, error in 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
      var placesArray = [GooglePlace]() 
      if let aData = data { 
       let json = JSON(data:aData, options:NSJSONReadingOptions.MutableContainers, error:nil) 
       if let results = json["results"].arrayObject as? [[String : AnyObject]] { 
        for rawPlace in results { 
         let place = GooglePlace(dictionary: rawPlace, acceptedTypes: types) 
         placesArray.append(place) 
         if let reference = place.photoReference { 
          self.fetchPhotoFromReference(reference) { image in 
           place.photo = image 
          } 
         } 
        } 
       } 
      } 
      dispatch_async(dispatch_get_main_queue()) { 
       completion(placesArray) 
      } 
     } 
     placesTask?.resume() 
    } 


    func fetchPhotoFromReference(reference: String, completion: ((UIImage?) -> Void)) ->() { 
     if let photo = photoCache[reference] as UIImage? { 
      completion(photo) 
     } else { 
      let urlString = "http://localhost:10000/maps/api/place/photo?maxwidth=200&photoreference=\(reference)" 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
      session.downloadTaskWithURL(NSURL(string: urlString)!) {url, response, error in 
       UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
       if let url = url { 
        let downloadedPhoto = UIImage(data: NSData(contentsOfURL: url)!) 
        self.photoCache[reference] = downloadedPhoto 
        dispatch_async(dispatch_get_main_queue()) { 
         completion(downloadedPhoto) 
        } 
       } 
       else { 
        dispatch_async(dispatch_get_main_queue()) { 
         completion(nil) 
        } 
       } 
       }.resume() 
     } 
    } 
} 

但我有两个错误。

对于此行:

urlString = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! 

我得到了错误:

Value of type 'String' has no member 'stringByAddingPercentEncodingWithAllowedCharacters'

,并在这条线:

UIApplication.sharedApplication().networkActivityIndicatorVisible = true 

我得到了错误:

Cannot call value of non-function type 'UIApplication'

我试图在网上寻找这些问题的解决方案,但没有。有人能告诉我如何调整这些吗?

+0

搜索stringByAddingPercentEncodingWithAllowedCharacters +夫特3:https://stackoverflow.com/questions/32064754/how-to-use-stringbyaddingpercentencodingwithallowedch aracters-for-a-url-in-swi(否则,Swift 3签名在文档中) – Larme

回答

1

这些函数名与斯威夫特3.改变对于第一个,你应该使用String.addingPercentEncoding(withAllowedCharacters:)

urlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) 

此外,UIApplication.sharedApplication()成为UIApplication.sharednetworkActivityIndicatorVisible斯威夫特3有一个is前缀,类似于其他布尔值:

UIApplication.shared.isNetworkActivityIndicatorVisible = true 
+0

谢谢你的工作!我只采取这最后一个问题:“这种表达式的类型是不明确的,没有更多的上下文”在这一行let downloadPhoto = UIImage(data:NSData(contentsOfURL:url)!) – bero

+0

@bero Swift 3的语法是'let downloadedPhoto = UIImage(data:Data(contentsOf:url))' – the4kman

+0

它的工作,谢谢! – bero

相关问题