From b992a8eabeeeaf1d8aaefe7b913c83277afaa378 Mon Sep 17 00:00:00 2001 From: Aleksey Rodionov Date: Fri, 27 Oct 2017 12:29:07 +0300 Subject: [PATCH 1/2] code refactoring --- .../xcschemes/xcschememanagement.plist | 24 ++++ .../xcschemes/xcschememanagement.plist | 14 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 19219 bytes SwiftStyle/Rainy/Rainy/AppDelegate.swift | 35 +---- .../Rainy/CurrentWeatherViewController.swift | 121 +++++++++++------- .../Rainy/HomeWeatherViewController.swift | 83 ++++++------ .../Rainy/Rainy/SettingsViewController.swift | 27 ++-- SwiftStyle/Rainy/Rainy/WeatherForecast.swift | 6 +- 8 files changed, 170 insertions(+), 140 deletions(-) create mode 100644 SwiftStyle/Rainy/Pods/Pods.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 SwiftStyle/Rainy/Rainy.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 SwiftStyle/Rainy/Rainy.xcworkspace/xcuserdata/hollywood.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/SwiftStyle/Rainy/Pods/Pods.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist b/SwiftStyle/Rainy/Pods/Pods.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..74bc345 --- /dev/null +++ b/SwiftStyle/Rainy/Pods/Pods.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,24 @@ + + + + + SchemeUserState + + Alamofire.xcscheme + + orderHint + 1 + + Pods-Rainy.xcscheme + + orderHint + 2 + + SwiftyJSON.xcscheme + + orderHint + 3 + + + + diff --git a/SwiftStyle/Rainy/Rainy.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist b/SwiftStyle/Rainy/Rainy.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0f90625 --- /dev/null +++ b/SwiftStyle/Rainy/Rainy.xcodeproj/xcuserdata/hollywood.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + Rainy.xcscheme + + orderHint + 0 + + + + diff --git a/SwiftStyle/Rainy/Rainy.xcworkspace/xcuserdata/hollywood.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftStyle/Rainy/Rainy.xcworkspace/xcuserdata/hollywood.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..fb665bebee6ebb04a6823741054f726edbeb03bd GIT binary patch literal 19219 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 Bool { - // Override point for customization after application launch. return true } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - } - - - - - diff --git a/SwiftStyle/Rainy/Rainy/CurrentWeatherViewController.swift b/SwiftStyle/Rainy/Rainy/CurrentWeatherViewController.swift index 89abfb3..88654b3 100644 --- a/SwiftStyle/Rainy/Rainy/CurrentWeatherViewController.swift +++ b/SwiftStyle/Rainy/Rainy/CurrentWeatherViewController.swift @@ -11,9 +11,7 @@ import CoreLocation import Alamofire import SwiftyJSON - - -struct coords{ +struct coords { var lat: Double = 0 var lon: Double = 0 } @@ -27,9 +25,10 @@ class CurrentWeatherViewController: UIViewController, CLLocationManagerDelegate @IBOutlet weak var imageWeather: UIImageView! private var locationManager: CLLocationManager! - // private let constrain: Constants = Constants() + + // private let constrain: Constants = Constants() private var currentForecast: WeatherForecast? { - didSet{ + didSet { reloadUI() } } @@ -54,65 +53,80 @@ class CurrentWeatherViewController: UIViewController, CLLocationManagerDelegate "50d":#imageLiteral(resourceName: "fog"), "50n":#imageLiteral(resourceName: "fog")] - private var myCoords: coords = coords() - + // MARK: UIViewController methods override func viewDidLoad() { super.viewDidLoad() + locationManager = CLLocationManager() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers - if(CLLocationManager.authorizationStatus() == .notDetermined){ + + if(CLLocationManager.authorizationStatus() == .notDetermined) { locationManager.requestWhenInUseAuthorization() } - if CLLocationManager.locationServicesEnabled(){ + if CLLocationManager.locationServicesEnabled() { locationManager.startUpdatingLocation() } - DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: { + + DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) { self.updateCurrentForecast() - }) + } } + // MARK: IBActions @IBAction func reloadButtonPressed(_ sender: AnyObject) { - if(CLLocationManager.authorizationStatus() == .notDetermined){ + if(CLLocationManager.authorizationStatus() == .notDetermined) { locationManager.requestWhenInUseAuthorization() } - if CLLocationManager.locationServicesEnabled(){ + if CLLocationManager.locationServicesEnabled() { locationManager.startUpdatingLocation() } + updateCurrentForecast() } - - - internal func locationManager(_ manager: CLLocationManager, - didFailWithError error: Error) { - print("error: ", error) + + // MARK: Internal methods + internal func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + print("error: \(error)") } internal func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { self.myCoords.lat = locations[0].coordinate.latitude self.myCoords.lon = locations[0].coordinate.longitude + locationManager.stopUpdatingLocation() } - - private func updateCurrentForecast(){ - Alamofire.request("http://api.openweathermap.org/data/2.5/weather",method: .get,parameters: ["lat":myCoords.lat,"lon": myCoords.lon,"APPID": "","units":"metric"],encoding: JSONEncoding.default,headers: nil).responseJSON{response in - guard response.result.isSuccess else{ - return - } - let json = JSON(response.result.value!) - self.currentForecast = WeatherForecast(currentWeatherTempurature: round(10 * json["main"]["temp"].doubleValue) / 10, - timeStamp: self.getCurrentTime(), - imageName: json["weather"][0]["icon"].string!, - locationCoordinates: (self.myCoords.lat, self.myCoords.lon), - humidity: json["main"]["humidity"].int, - pressure: json["main"]["pressure"].int, - wind: round(10 * json["wind"]["speed"].doubleValue) / 10, cityName: json["name"].string, - stateWeather: json["weather"][0]["description"].string) + // MARK: Private methods + private func updateCurrentForecast() { + Alamofire.request("http://api.openweathermap.org/data/2.5/weather", + method: .get, + parameters: ["lat":myCoords.lat, "lon": myCoords.lon, "APPID": "", "units":"metric"], + encoding: JSONEncoding.default, + headers: nil).responseJSON { response in + guard response.result.isSuccess else { + return + } + + guard let resultValue = response.result.value else { + return + } + + let json = JSON(resultValue) + + self.currentForecast = WeatherForecast(currentWeatherTempurature: round(10 * json["main"]["temp"].doubleValue) / 10, + timeStamp: self.getCurrentTime(), + imageName: json["weather"][0]["icon"].string!, + locationCoordinates: (self.myCoords.lat, self.myCoords.lon), + humidity: json["main"]["humidity"].int, + pressure: json["main"]["pressure"].int, + wind: round(10 * json["wind"]["speed"].doubleValue) / 10, + cityName: json["name"].string, + stateWeather: json["weather"][0]["description"].string) } } @@ -120,49 +134,58 @@ class CurrentWeatherViewController: UIViewController, CLLocationManagerDelegate Alamofire.request("http://www.mapquestapi.com/traffic/v2/incidents", parameters: ["boundingBox": "\(myCoords.lat),\(myCoords.lon),\(myCoords.lat - 1),\(myCoords.lon - 1)", "key": ""]) - .responseJSON{response in - guard response.result.isSuccess else{ + .responseJSON { response in + guard response.result.isSuccess else { + return + } + + guard let resultValue = response.result.value else { return } - _ = JSON(response.result.value!) + _ = JSON(resultValue) } } - private func getCurrentTime() -> String{ + private func getCurrentTime() -> String { let date = NSDate() let calendar = NSCalendar.current var currentTime: String let components = calendar.dateComponents([.hour, .minute], from: date as Date!) var hour: String = String(describing: components.hour!) var minute: String = String(describing: components.minute!) - if hour.characters.count == 1{ + + if hour.characters.count == 1 { hour = "0" + hour } - if(minute.characters.count == 1){ + if(minute.characters.count == 1) { minute = "0" + minute } + currentTime = "\(hour):\(minute)" + return currentTime } - - private func reloadUI(){ - timeLabel.text = "Updated: \(currentForecast!.timeStamp)" - if let temp = currentForecast?.currentWeatherTempurature{ + guard let currentForecast = currentForecast else { + return + } + + timeLabel.text = "Updated: \(currentForecast.timeStamp)" + + if let temp = currentForecast.currentWeatherTempurature { temperatureLabel.text = "\(temp)℃" } - if let city = currentForecast?.cityName{ + if let city = currentForecast.cityName { cityNameLabel.text = city } - if let wi = currentForecast?.wind{ + if let wi = currentForecast.wind { windLabel.text = "\(wi)" } - if let st = currentForecast?.stateWeather{ + if let st = currentForecast.stateWeather { stateLabel.text = st } - imageWeather.image = photoResources[(currentForecast?.imageName)!] + + imageWeather.image = photoResources[currentForecast.imageName] } } - - diff --git a/SwiftStyle/Rainy/Rainy/HomeWeatherViewController.swift b/SwiftStyle/Rainy/Rainy/HomeWeatherViewController.swift index 046675e..40dbfd1 100644 --- a/SwiftStyle/Rainy/Rainy/HomeWeatherViewController.swift +++ b/SwiftStyle/Rainy/Rainy/HomeWeatherViewController.swift @@ -19,19 +19,21 @@ class HomeWeatherViewController: UIViewController { @IBOutlet weak var cityNameLabel: UILabel! private var setts = UserDefaults.standard - private var cityName: String{ - get{ - if let name = setts.value(forKey: "cityName"){ + private var cityName: String { + get { + if let name = setts.value(forKey: "cityName") { return name as! String } - else{ + else { return "Saint Petersburg" } } - }//"Saint Petersburg" -// private let constrain: Constants = Constants() + } + + // "Saint Petersburg" + // private let constrain: Constants = Constants() private var currentForecast: WeatherForecast? { - didSet{ + didSet { reloadUI() } } @@ -57,86 +59,83 @@ class HomeWeatherViewController: UIViewController { "50n":#imageLiteral(resourceName: "fog") ] - - + // MARK: UIViewController methods override func viewDidLoad() { super.viewDidLoad() updateCurrentForecast() } - + // MARK: IBActions @IBAction func refreshButtonPressed(_ sender: Any) { updateCurrentForecast() } - - private func updateCurrentForecast(){ + // MARK: Private methods + private func updateCurrentForecast() { Alamofire.request("http://api.openweathermap.org/data/2.5/weather", - parameters: ["q": cityName, - "APPID": "","units":"metric"]) - .responseJSON{response in - guard response.result.isSuccess else{ + parameters: ["q": cityName, "APPID": "","units":"metric"]).responseJSON { response in + guard response.result.isSuccess else { return } - let json = JSON(response.result.value!) + + guard let resultValue = response.result.value else { + return + } + + let json = JSON(resultValue) + self.currentForecast = WeatherForecast(currentWeatherTempurature: round(10 * json["main"]["temp"].doubleValue) / 10, timeStamp: self.getCurrentTime(), imageName: json["weather"][0]["icon"].string!, locationCoordinates: (0, 0), humidity: json["main"]["humidity"].int, pressure: json["main"]["pressure"].int, - wind: round(10 * json["wind"]["speed"].doubleValue) / 10, cityName: json["name"].string, + wind: round(10 * json["wind"]["speed"].doubleValue) / 10, + cityName: json["name"].string, stateWeather: json["weather"][0]["description"].string) } } - private func getCurrentTime() -> String{ + private func getCurrentTime() -> String { let date = NSDate() let calendar = NSCalendar.current var currentTime: String let components = calendar.dateComponents([.hour, .minute], from: date as Date!) var hour: String = String(describing: components.hour!) var minute: String = String(describing: components.minute!) + if hour.characters.count == 1{ hour = "0" + hour } if(minute.characters.count == 1){ minute = "0" + minute } + currentTime = "\(hour):\(minute)" + return currentTime } - private func reloadUI(){ - timeLabel.text = "Updated: \(currentForecast!.timeStamp)" - if let temp = currentForecast?.currentWeatherTempurature{ + private func reloadUI() { + guard let currentForecast = currentForecast else { + return + } + + timeLabel.text = "Updated: \(currentForecast.timeStamp)" + + if let temp = currentForecast.currentWeatherTempurature{ temperatureLabel.text = "\(temp)℃" } - if let city = currentForecast?.cityName{ + if let city = currentForecast.cityName{ cityNameLabel.text = city } - if let wi = currentForecast?.wind{ + if let wi = currentForecast.wind{ windLabel.text = "\(wi)" } - if let st = currentForecast?.stateWeather{ + if let st = currentForecast.stateWeather{ stateLabel.text = st } - imageWeatherView.image = photoResources[(currentForecast?.imageName)!] + + imageWeatherView.image = photoResources[currentForecast.imageName] } - - - } - - - - - - - - - - - - - diff --git a/SwiftStyle/Rainy/Rainy/SettingsViewController.swift b/SwiftStyle/Rainy/Rainy/SettingsViewController.swift index 87461a0..a92a02f 100644 --- a/SwiftStyle/Rainy/Rainy/SettingsViewController.swift +++ b/SwiftStyle/Rainy/Rainy/SettingsViewController.swift @@ -12,25 +12,28 @@ class SettingsViewController: UIViewController { @IBOutlet weak var textField: UITextField! @IBOutlet weak var swifthLocation: UISwitch! - @IBAction func saveButtonPressed(_ sender: Any) { - self.view.endEditing(true) - setts.set(textField.text!, forKey: "cityName") - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - textField.resignFirstResponder() - } - private var setts = UserDefaults.standard + + // MARK: UIViewController methods override func viewDidLoad() { super.viewDidLoad() - if let name = setts.value(forKey: "cityName"){ + + if let name = setts.value(forKey: "cityName") { textField.text = String(describing: name) } - else{ + else { textField.text = "Saint Petersburg" } } - + // MARK: UIResponser methods + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + textField.resignFirstResponder() + } + + // MARK: IBActions + @IBAction func saveButtonPressed(_ sender: Any) { + self.view.endEditing(true) + setts.set(textField.text!, forKey: "cityName") + } } diff --git a/SwiftStyle/Rainy/Rainy/WeatherForecast.swift b/SwiftStyle/Rainy/Rainy/WeatherForecast.swift index 47152bc..8571e11 100644 --- a/SwiftStyle/Rainy/Rainy/WeatherForecast.swift +++ b/SwiftStyle/Rainy/Rainy/WeatherForecast.swift @@ -8,7 +8,6 @@ import Foundation - class WeatherForecast{ var currentWeatherTempurature: Double? var timeStamp: String @@ -20,9 +19,10 @@ class WeatherForecast{ var cityName: String? var stateWeather: String? - init(currentWeatherTempurature: Double?, + init(currentWeatherTempurature: Double?, timeStamp: String, imageName: String, - locationCoordinates: (Double, Double)?, humidity: Int?, pressure: Int?, + locationCoordinates: (Double, Double)?, + humidity: Int?, pressure: Int?, wind: Double?, cityName: String?, stateWeather: String?) { self.currentWeatherTempurature = currentWeatherTempurature From 7c1d2694fe439a0bc9819e0c3558c778186aabc6 Mon Sep 17 00:00:00 2001 From: Aleksey Rodionov Date: Fri, 27 Oct 2017 12:44:03 +0300 Subject: [PATCH 2/2] Algorithms have been realized --- Algorithms/TwoSum.playground/Contents.swift | 29 ++++++++++++++++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 8977 bytes .../UserInterfaceState.xcuserstate | Bin 19219 -> 19211 bytes 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 Algorithms/TwoSum.playground/playground.xcworkspace/xcuserdata/hollywood.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/Algorithms/TwoSum.playground/Contents.swift b/Algorithms/TwoSum.playground/Contents.swift index 30cc77a..c9f0ae3 100644 --- a/Algorithms/TwoSum.playground/Contents.swift +++ b/Algorithms/TwoSum.playground/Contents.swift @@ -13,11 +13,36 @@ let integers: [Int] = [2, 5, 4, 12, 7] Фукция должна возвращать индексы двух чисел из массива array, сумма которых равна переданному значению target */ +//func findTarget(_ target: Int, in array: [Int]) -> [Array.Index] { +// // Ваша реализация +// for i in 0.. [Array.Index] { // Ваша реализация - - return [0, 1] + var dict = [Int: Int]() + + for i in 0..)?905pIEvuodowZEzoKhx_3H*a45i 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 O%765va*chbP5fUGO$xyP literal 0 HcmV?d00001 diff --git a/SwiftStyle/Rainy/Rainy.xcworkspace/xcuserdata/hollywood.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftStyle/Rainy/Rainy.xcworkspace/xcuserdata/hollywood.xcuserdatad/UserInterfaceState.xcuserstate index fb665bebee6ebb04a6823741054f726edbeb03bd..7b68345e10a256b6caa1ddb2f24c2ad919856652 100644 GIT binary patch delta 4212 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 delta 4212 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