From 9c8fc01783527a2fd4049d191e5b855da928e8da Mon Sep 17 00:00:00 2001 From: fennelouski <2965903+fennelouski@users.noreply.github.com> Date: Sun, 12 Nov 2017 14:24:20 -0500 Subject: [PATCH] Updated (ish) for Swift 4 --- API/WAPIManager.swift | 189 ++++++++++++++++++++++-------------------- 1 file changed, 99 insertions(+), 90 deletions(-) diff --git a/API/WAPIManager.swift b/API/WAPIManager.swift index 9c6ab63..58fc20f 100644 --- a/API/WAPIManager.swift +++ b/API/WAPIManager.swift @@ -42,7 +42,7 @@ public enum Language : String { public enum WeatherResult { case Success(JSON) case Error(String) - + public var isSuccess: Bool { switch self { case .Success: @@ -55,37 +55,37 @@ public enum WeatherResult { public class WAPIManager { - - private var params = [String : AnyObject]() + + private var params = [String : String]() public var temperatureFormat: TemperatureFormat = .Kelvin { didSet { params["units"] = temperatureFormat.rawValue } } - + public var language: Language = .English { didSet { params["lang"] = language.rawValue } } - + public init(apiKey: String) { params["APPID"] = apiKey } - + public convenience init(apiKey: String, temperatureFormat: TemperatureFormat) { self.init(apiKey: apiKey) self.temperatureFormat = temperatureFormat self.params["units"] = temperatureFormat.rawValue - + } - + public convenience init(apiKey: String, temperatureFormat: TemperatureFormat, lang: Language) { self.init(apiKey: apiKey, temperatureFormat: temperatureFormat) - + self.language = lang self.temperatureFormat = temperatureFormat - + params["units"] = temperatureFormat.rawValue params["lang"] = lang.rawValue } @@ -93,9 +93,9 @@ public class WAPIManager { // MARK: Private functions extension WAPIManager { - private func apiCall(method: Router, response: (WeatherResult) -> Void) { - Alamofire.request(method).responseJSON { (_, _, data) in - guard let js: AnyObject = data.value where data.isSuccess else { + private func apiCall(method: Router, response: @escaping (WeatherResult) -> Void) { + Alamofire.request(method).responseJSON { (data) in + guard let js: AnyObject = data.value as AnyObject? else { response(WeatherResult.Error(data.error.debugDescription)) return } @@ -105,18 +105,22 @@ extension WAPIManager { } enum Router: URLRequestConvertible { + func asURLRequest() throws -> URLRequest { + fatalError() + } + static let baseURLString = "http://api.openweathermap.org/data/" static let apiVersion = "2.5" - + case Weather([String: AnyObject]) case ForeCast([String: AnyObject]) case DailyForecast([String: AnyObject]) case HirstoricData([String: AnyObject]) - - var method: Alamofire.Method { - return .GET + + var method: HTTPMethod { + return HTTPMethod.get } - + var path: String { switch self { case .Weather: @@ -129,26 +133,31 @@ enum Router: URLRequestConvertible { return "/history/city" } } - + // MARK: URLRequestConvertible - var URLRequest: NSMutableURLRequest { - let URL = NSURL(string: Router.baseURLString + Router.apiVersion)! - let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path)) - mutableURLRequest.HTTPMethod = method.rawValue - - func encode(params: [String: AnyObject]) -> NSMutableURLRequest { - return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: params).0 + var URLRequest: DataRequest? { + guard let URL = NSURL(string: Router.baseURLString + Router.apiVersion) else { return nil } + guard let pathURL = URL.appendingPathComponent(path) else { return nil } + + func encode(params: [String: AnyObject]) -> DataRequest { + return Alamofire.request(pathURL.absoluteString, + method: method, + parameters: params) + .responseJSON { (response: DataResponse) in + guard let json = response.result.value as? [String:Any] else { return } + print("\(json)") + } } - + switch self { case .Weather(let parameters): - return encode(parameters) + return encode(params: parameters) case .ForeCast(let parameters): - return encode(parameters) + return encode(params: parameters) case .DailyForecast(let parameters): - return encode(parameters) + return encode(params: parameters) case .HirstoricData(let parameters): - return encode(parameters) + return encode(params: parameters) } } } @@ -156,106 +165,106 @@ enum Router: URLRequestConvertible { //MARK: - Get Current Weather extension WAPIManager { - - private func currentWeather(params: [String:AnyObject], data: (WeatherResult) -> Void) { - apiCall(Router.Weather(params)) { data($0) } + + private func currentWeather(params: [String:AnyObject], data: @escaping (WeatherResult) -> Void) { + apiCall(method: Router.Weather(params)) { data($0) } } - - public func currentWeatherByCityNameAsJson(cityName: String, data: (WeatherResult) -> Void) { + + public func currentWeatherByCityNameAsJson(cityName: String, data: @escaping (WeatherResult) -> Void) { params["q"] = cityName - - currentWeather(params) { data($0) } + + currentWeather(params: params as [String : AnyObject]) { data($0) } } - - public func currentWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: (WeatherResult) -> Void) { - + + public func currentWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: @escaping (WeatherResult) -> Void) { + params["lat"] = String(stringInterpolationSegment: coordinates.latitude) params["lon"] = String(stringInterpolationSegment: coordinates.longitude) - - currentWeather(params) { data($0) } + + currentWeather(params: params as [String : AnyObject]) { data($0) } } - + } //MARK: - Get Forecast extension WAPIManager { - - private func forecastWeather(parameters: [String:AnyObject], data: (WeatherResult) -> Void) { - apiCall(Router.ForeCast(params)) { data($0) } + + private func forecastWeather(parameters: [String:AnyObject], data: @escaping (WeatherResult) -> Void) { + apiCall(method: Router.ForeCast(params as [String : AnyObject])) { data($0) } } - - public func forecastWeatherByCityNameAsJson(cityName: String, data: (WeatherResult) -> Void) { + + public func forecastWeatherByCityNameAsJson(cityName: String, data: @escaping (WeatherResult) -> Void) { params["q"] = cityName - - forecastWeather(params) { data($0) } + + forecastWeather(parameters: params as [String : AnyObject]) { data($0) } } - - public func forecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: (WeatherResult) -> Void) { - + + public func forecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: @escaping (WeatherResult) -> Void) { + params["lat"] = String(stringInterpolationSegment: coordinates.latitude) params["lon"] = String(stringInterpolationSegment: coordinates.longitude) - - forecastWeather(params) { data($0) } + + forecastWeather(parameters: params as [String : AnyObject]) { data($0) } } - + } //MARK: - Get Daily Forecast extension WAPIManager { - - private func dailyForecastWeather(parameters: [String:AnyObject], data: (WeatherResult) -> Void) { - apiCall(Router.DailyForecast(params)) { data($0) } + + private func dailyForecastWeather(parameters: [String:AnyObject], data: @escaping (WeatherResult) -> Void) { + apiCall(method: Router.DailyForecast(params as [String : AnyObject])) { data($0) } } - - public func dailyForecastWeatherByCityNameAsJson(cityName: String, data: (WeatherResult) -> Void) { + + public func dailyForecastWeatherByCityNameAsJson(cityName: String, data: @escaping (WeatherResult) -> Void) { params["q"] = cityName - - dailyForecastWeather(params) { data($0) } + + dailyForecastWeather(parameters: params as [String : AnyObject]) { data($0) } } - - public func dailyForecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: (WeatherResult) -> Void) { - + + public func dailyForecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: @escaping (WeatherResult) -> Void) { + params["lat"] = String(stringInterpolationSegment: coordinates.latitude) params["lon"] = String(stringInterpolationSegment: coordinates.longitude) - - dailyForecastWeather(params) { data($0) } + + dailyForecastWeather(parameters: params as [String : AnyObject]) { data($0) } } - + } //MARK: - Get Historic Data extension WAPIManager { - - private func historicData(parameters: [String:AnyObject], data: (WeatherResult) -> Void) { + + private func historicData(parameters: [String:AnyObject], data: @escaping (WeatherResult) -> Void) { params["type"] = "hour" - - apiCall(Router.HirstoricData(params)) { data($0) } + + apiCall(method: Router.HirstoricData(params as [String : AnyObject])) { data($0) } } - - public func historicDataByCityNameAsJson(cityName: String, start: NSDate, end: NSDate?, data: (WeatherResult) -> Void) { + + public func historicDataByCityNameAsJson(cityName: String, start: NSDate, end: NSDate?, data: @escaping (WeatherResult) -> Void) { params["q"] = cityName - - params["start"] = start.timeIntervalSince1970 + + params["start"] = "\(start.timeIntervalSince1970)" if let endDate = end { - params["end"] = endDate.timeIntervalSince1970 + params["end"] = "\(endDate.timeIntervalSince1970)" } - - historicData(params) { data($0) } + + historicData(parameters: params as [String : AnyObject]) { data($0) } } - - public func historicDataByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, start: NSDate, end: NSDate?, data: (WeatherResult) -> Void) { - + + public func historicDataByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, start: NSDate, end: NSDate?, data: @escaping (WeatherResult) -> Void) { + params["lat"] = String(stringInterpolationSegment: coordinates.latitude) params["lon"] = String(stringInterpolationSegment: coordinates.longitude) - - params["start"] = start.timeIntervalSince1970 + + params["start"] = "\(start.timeIntervalSince1970)" if let endDate = end { - params["end"] = endDate.timeIntervalSince1970 + params["end"] = "\(endDate.timeIntervalSince1970)" } - - historicData(params) { data($0) } + + historicData(parameters: params as [String : AnyObject]) { data($0) } } - + }