From ca9606599e8f0a25840139c8f81bd3b37a396677 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Thu, 4 Jun 2020 16:02:21 +0300 Subject: [PATCH 1/7] update --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7415f74..6382685 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# swiftFirstLesson \ No newline at end of file +# swiftFirstLesson +add 6-l From 604ea6bfe295a98d90b780cd3604c87f05673015 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sun, 7 Jun 2020 15:24:30 +0300 Subject: [PATCH 2/7] Delete 5-lesson --- .../Contents.swift | 204 ------------------ .../contents.xcplayground | 4 - 2 files changed, 208 deletions(-) delete mode 100644 5l_ChukarkovKonstantin.playground/Contents.swift delete mode 100644 5l_ChukarkovKonstantin.playground/contents.xcplayground diff --git a/5l_ChukarkovKonstantin.playground/Contents.swift b/5l_ChukarkovKonstantin.playground/Contents.swift deleted file mode 100644 index f95aa9e..0000000 --- a/5l_ChukarkovKonstantin.playground/Contents.swift +++ /dev/null @@ -1,204 +0,0 @@ -import UIKit - -enum ChangeIgnition: String { - case start = "запущен" - case stop = "заглушен" -} - -enum ChangeWidows: String { - case open = "открыты" - case close = "закрыты" -} - - -protocol Car { - - - var model: String { get set } - var age: Int { get set } - var ignition: ChangeIgnition { get set } - var windows: ChangeWidows { get set } - - mutating func changeIgnition() - mutating func changeWidows() -} - - -extension Car { - - - - mutating func changeIgnition(properties: ChangeIgnition) { - switch properties { - case .start: self.ignition = .start - print("У \(self.model) двигатель \(self.ignition.rawValue)") - case .stop: self.ignition = .stop - print("У \(self.model) двигатель \(self.ignition.rawValue)") - } - } - - mutating func changeWidows(properties: ChangeWidows) { - switch properties { - case .open: self.windows = .open - print("У \(self.model) окна \(self.windows.rawValue)") - case .close: self.windows = .close - print("У \(self.model) окна \(self.windows.rawValue)") - } - } -} - -class TrunkCar: Car { - - func changeWidows() { - } - - func changeIgnition() { - } - - - var model: String = "" - var age: Int = 0 - var ignition: ChangeIgnition = .stop - var windows: ChangeWidows = .close - - enum TypeCar: String { - case sport = "Спортивной" - case truck = "Грузовой" - } - - - let type: TypeCar = .truck - - var bootVolume: Int - - - init(model: String, age: Int, bootVolume: Int) { - self.bootVolume = bootVolume - self.model = model - self.age = age - } - - var trunkVolume: Int = 0 - - enum ChangeTrunkStatus { - case load - case upload - } - - func changeTrunkVolume(act: ChangeTrunkStatus,trunkVolume: Int) { - switch act { - case .load: - self.trunkVolume += trunkVolume - if self.trunkVolume > self.bootVolume { - let unnecessary = self.trunkVolume - self.bootVolume - self.trunkVolume = self.bootVolume - print("Ошибка, слишком большой объем пытаетесь загрузить. Объем багажа \(self.model) заполнен на максимум: \(self.trunkVolume)/\(self.bootVolume) и осталось незагруженно: \(unnecessary)") - } - else { - print("Погрузка в \(self.model) прошла успешна, багажник заполнен на \(self.trunkVolume) из \(self.bootVolume)") - } - case .upload: - self.trunkVolume -= trunkVolume - if self.trunkVolume < 0 { - self.trunkVolume += trunkVolume - print("Ошибка, из \(self.model) невозможно выгрузить \(trunkVolume) литров, там всего \(self.trunkVolume) литров") - } - else { - print("Выгрузка из \(self.model) прошла успешна, багажник заполнен на \(self.trunkVolume) из \(self.bootVolume)") - } - } - } - -} - -extension TrunkCar: CustomStringConvertible { - var description: String { - return "Марка \(self.type.rawValue) машины: \(self.model), год выпуска: \(self.age), объем багажника: \(self.trunkVolume)/\(self.bootVolume) литров, двигатель \(self.ignition.rawValue), окна \(self.windows.rawValue)" - } -} - - -class SportCar: Car { - func changeWidows() { - } - - func changeIgnition() { - } - - enum TypeCar: String { - case sport = "Спортивной" - case truck = "Грузовой" - } - - var model: String = "" - var age: Int = 0 - var ignition: ChangeIgnition = .stop - var windows: ChangeWidows = .close - - let type: TypeCar = .sport - - var topNitro: Int - - var nitro: Int = 0 - - init(model: String, age: Int, topNitro: Int) { - self.topNitro = topNitro - self.nitro = topNitro - self.model = model - self.age = age - } - - - enum ChangeNitro { - case refill - case use - } - - func changeNitro(act: ChangeNitro, nitro: Int) { - switch act { - case .refill: - self.nitro += nitro - if self.nitro > self.topNitro { - let unnecessary = self.nitro - self.topNitro - self.nitro = self.topNitro - print("Ошибка, слишком большой объем пытаетесь загрузить. Бак нитро \(self.model) заполнен на максимум: \(self.nitro)/\(self.topNitro) литров, и осталось незагруженно: \(unnecessary)") - } - else { - print("Добавка нитро в \(self.model) прошла успешна, бак нитро заполнен на \(self.nitro) из \(self.topNitro)") - } - case .use: - self.nitro -= nitro - if self.nitro < 0 { - self.nitro += nitro - print("Ошибка, \(self.model) не может использовать \(nitro) литров, там всего \(self.nitro) литров") - } - else { - print("Использование \(self.model) нитро прошла успешна, бак нитро заполнен на \(self.nitro) из \(self.topNitro)") - } - } - } -} - -extension SportCar: CustomStringConvertible { -var description: String { - return "Марка \(self.type.rawValue) машины: \(self.model), год выпуска: \(self.age), бак нитро: \(self.nitro)/\(self.topNitro) литров, двигатель \(self.ignition.rawValue), окна \(self.windows.rawValue)" - } -} - -var ladaLargus = TrunkCar(model: "Lada Largus", age: 2014, bootVolume: 560) -var mazda = SportCar(model: "Mazda", age: 2009, topNitro: 5) -var largus = TrunkCar(model: "Lada", age: 2007, bootVolume: 350) -var mazda3 = SportCar(model: "Mazda 3", age: 2018, topNitro: 10) - -print(ladaLargus.description) -print(mazda3.description) -ladaLargus.changeTrunkVolume(act: .load, trunkVolume: 300) -print(ladaLargus.description) -mazda3.changeNitro(act: .use, nitro: 5) -mazda3.changeNitro(act: .refill, nitro: 7) -largus.changeWidows(properties: .open) -mazda.changeIgnition(properties: .start) -largus.changeTrunkVolume(act: .load, trunkVolume: 400) -mazda.changeNitro(act: .use, nitro: 3) -print(ladaLargus.description) -print(mazda.description) diff --git a/5l_ChukarkovKonstantin.playground/contents.xcplayground b/5l_ChukarkovKonstantin.playground/contents.xcplayground deleted file mode 100644 index 5da2641..0000000 --- a/5l_ChukarkovKonstantin.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 16797f9fd96dbd8b950cd1ef798d3f01441e82fc Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sun, 7 Jun 2020 15:39:44 +0300 Subject: [PATCH 3/7] --- --- .DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 1e2f90ab9d97bf3eb13ab5842da9c8489aff4da3..401f94bbc1c2f3d7a0faf22ab620a6351a550797 100644 GIT binary patch delta 310 zcmZoMXfc=|#>B!ku~2NHo+2ar#DLw41(=u_*(dWb9%oi$Fq>S$=r6pIfq_BeKNtX6 z3=9x)hx&q&B%jjak|Lmx9YZifB||Yo2}3GFE`vTp7(+fo4nrxBoeC7yXK-Oi1j;1> zS)o9FDnk)iG#jWY53DN@NS82V0!ffske+NHKcArh$S-Cn2g;-Y`EEcOq_c#<2dIX> z7{~+}ppS49AJ9#HP&YxHIr##kDL)rO5Q8g&BhYMLAYC{40iy^Hqc~6>)L)w!nfMtu ivvcrs07C=F`OZ9B`mu~2NHo+2aj#DLw5%#(Roj!&M>X0-V)8yDkd1rBzWi47k&vvcrs f099@l Date: Sun, 7 Jun 2020 15:43:43 +0300 Subject: [PATCH 4/7] Delete 6 lesson, add 7 lesson --- .../Contents.swift | 45 ------------ .../Contents.swift | 73 +++++++++++++++++++ .../contents.xcplayground | 0 3 files changed, 73 insertions(+), 45 deletions(-) delete mode 100644 6l_ChukarkovKonstantin.playground/Contents.swift create mode 100644 7l_ChukarkovKonstantin.playground/Contents.swift rename {6l_ChukarkovKonstantin.playground => 7l_ChukarkovKonstantin.playground}/contents.xcplayground (100%) diff --git a/6l_ChukarkovKonstantin.playground/Contents.swift b/6l_ChukarkovKonstantin.playground/Contents.swift deleted file mode 100644 index d8b0348..0000000 --- a/6l_ChukarkovKonstantin.playground/Contents.swift +++ /dev/null @@ -1,45 +0,0 @@ - -struct Stack { - - var items = [Element]() - mutating func push(_ item: Element) { - items.append(item) - } - - mutating func pop() -> Element { - return items.removeLast() - } - - mutating func append(_ item: Element) { - self.push(item) - } - - - var count: Int { - return items.count - } - - subscript(i: Int) -> Element? { - if i < items.count { - return items[i] - } - return nil - } - -} - - -var stack = Stack() - -stack.push("кот") -stack.push("бегемот") -stack.push("жираф") -stack.push("крыса") - -stack.pop() - -print(stack.count) - - -print(stack[1]!) -print(stack[4] as Any) diff --git a/7l_ChukarkovKonstantin.playground/Contents.swift b/7l_ChukarkovKonstantin.playground/Contents.swift new file mode 100644 index 0000000..f291778 --- /dev/null +++ b/7l_ChukarkovKonstantin.playground/Contents.swift @@ -0,0 +1,73 @@ + +print("Проверка банковской карты.\n1) Заблокированна карта банком или нет.\n2) Хватает ли средств на балансе для покупки товара") + +enum CardError: Error { + case smallBalance + case blockedAccount +} + +struct product { + var price: Double +} + +enum CardStatus { + case isBlocked + case isNotBlocked +} + +class CardOpation { + var balance: Double = 0 + var cardStatus = CardStatus.isNotBlocked + + func buySomething(product: product) throws { + guard cardStatus == .isNotBlocked else { + throw CardError.blockedAccount + } + guard product.price < self.balance else { + throw CardError.smallBalance + } + balance = self.balance - product.price + } + + func plusBalance (someMoney: Double) { + balance = self.balance + someMoney + } + + func printBalance() { + print ("Баланс вашей карты \(balance) рублей") + } + + func changeCardStatus(status: CardStatus){ + switch status { + case .isBlocked: cardStatus = .isBlocked + case .isNotBlocked: cardStatus = .isNotBlocked + } + } + +} + +let operation = CardOpation() + + +operation.plusBalance(someMoney: 10000) +operation.printBalance() +operation.changeCardStatus(status: .isBlocked) + + +do { + try operation.buySomething(product: .init(price: 4500)) +} catch CardError.smallBalance { + print("Недостаточно средств на карте") +} catch CardError.blockedAccount { + print("Ваша карта заблокирована") +} + +operation.changeCardStatus(status: .isNotBlocked) + +do { + try operation.buySomething(product: .init(price: 45500)) +} catch CardError.smallBalance { + print("Недостаточно средств на карте") +} catch CardError.blockedAccount { + print("Ваша карта заблокирована") +} diff --git a/6l_ChukarkovKonstantin.playground/contents.xcplayground b/7l_ChukarkovKonstantin.playground/contents.xcplayground similarity index 100% rename from 6l_ChukarkovKonstantin.playground/contents.xcplayground rename to 7l_ChukarkovKonstantin.playground/contents.xcplayground From 0838484397984ece487bd2c25994820cc7fd93fc Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sun, 7 Jun 2020 15:48:56 +0300 Subject: [PATCH 5/7] modified --- .DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 401f94bbc1c2f3d7a0faf22ab620a6351a550797..c09d3c0ba221a4196ce251f85b5bd9946ab2b65c 100644 GIT binary patch delta 68 zcmZoMXfc=|#>B)qu~2NHo+2a5#(>?7j4YFRSdMR=&Q`#B!ku~2NHo+2ar#(>?7ivyUM7}+QDFdb)BWH6gt!sIW!l7WFi<3AVx zSquyiafkYXk|dwf;*uhukR3xXLnT8oLkUAFLoS0pLl{FoLk>eJkevz?)n{;FNCe6y z0$HIzekwx|STq}`Di5qH5lELXWCBT$T9BS>AU~g>0LU+9C Date: Wed, 10 Jun 2020 23:06:59 +0300 Subject: [PATCH 6/7] add lesson Snake --- .DS_Store | Bin 6148 -> 6148 bytes .../Contents.swift | 73 --- .../contents.xcplayground | 4 - LessonSnake/.DS_Store | Bin 0 -> 6148 bytes .../LessonSnake.xcodeproj/project.pbxproj | 613 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 39077 bytes .../xcschemes/xcschememanagement.plist | 14 + LessonSnake/LessonSnake/Actions.sks | Bin 0 -> 1892 bytes LessonSnake/LessonSnake/AppDelegate.swift | 41 ++ .../AppIcon.appiconset/Contents.json | 98 +++ .../LessonSnake/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../LessonSnake/Base.lproj/Main.storyboard | 24 + LessonSnake/LessonSnake/GameScene.sks | Bin 0 -> 4694 bytes LessonSnake/LessonSnake/GameScene.swift | 155 +++++ .../LessonSnake/GameViewController.swift | 46 ++ LessonSnake/LessonSnake/Info.plist | 47 ++ LessonSnake/LessonSnake/Node/Apple.swift | 33 + LessonSnake/LessonSnake/Node/Snake.swift | 80 +++ .../LessonSnake/Node/SnakeBodyPart.swift | 39 ++ LessonSnake/LessonSnake/Node/SnakeHead.swift | 26 + LessonSnake/LessonSnakeTests/Info.plist | 22 + .../LessonSnakeTests/LessonSnakeTests.swift | 34 + LessonSnake/LessonSnakeUITests/Info.plist | 22 + .../LessonSnakeUITests.swift | 43 ++ 27 files changed, 1383 insertions(+), 77 deletions(-) delete mode 100644 7l_ChukarkovKonstantin.playground/Contents.swift delete mode 100644 7l_ChukarkovKonstantin.playground/contents.xcplayground create mode 100644 LessonSnake/.DS_Store create mode 100644 LessonSnake/LessonSnake.xcodeproj/project.pbxproj create mode 100644 LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcuserdata/konstantin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 LessonSnake/LessonSnake.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 LessonSnake/LessonSnake/Actions.sks create mode 100644 LessonSnake/LessonSnake/AppDelegate.swift create mode 100644 LessonSnake/LessonSnake/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 LessonSnake/LessonSnake/Assets.xcassets/Contents.json create mode 100644 LessonSnake/LessonSnake/Base.lproj/LaunchScreen.storyboard create mode 100644 LessonSnake/LessonSnake/Base.lproj/Main.storyboard create mode 100644 LessonSnake/LessonSnake/GameScene.sks create mode 100644 LessonSnake/LessonSnake/GameScene.swift create mode 100644 LessonSnake/LessonSnake/GameViewController.swift create mode 100644 LessonSnake/LessonSnake/Info.plist create mode 100644 LessonSnake/LessonSnake/Node/Apple.swift create mode 100644 LessonSnake/LessonSnake/Node/Snake.swift create mode 100644 LessonSnake/LessonSnake/Node/SnakeBodyPart.swift create mode 100644 LessonSnake/LessonSnake/Node/SnakeHead.swift create mode 100644 LessonSnake/LessonSnakeTests/Info.plist create mode 100644 LessonSnake/LessonSnakeTests/LessonSnakeTests.swift create mode 100644 LessonSnake/LessonSnakeUITests/Info.plist create mode 100644 LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift diff --git a/.DS_Store b/.DS_Store index c09d3c0ba221a4196ce251f85b5bd9946ab2b65c..14bec380fbb9af09de021cac8c451e2ca0d5bc0b 100644 GIT binary patch delta 398 zcmZoMXfc=|#>B!ku~2NHo+2ar#(>?7ivyUM7}+QDFdeVwX7FK1Whe&1e1<%RU?5Ip z$Yx0O%*jtq%E?b+U|x zNzBYkEduM#Oi2YQi3!ilOUW;H$}i1JDF*8ehDdO5aB^_Q3rJK~8=IKwC>WcY*6Ju! zo0}WxD3}&7Fm7h&;O78__GU-s@640=MI1SRrZRy{+8iOWh8Y0%B)qu~2NHo+2a5#(>?7j4YFRSdMR&V|&TCvB8^pGdl-A2T;joL5}at Vlles)IT(O|k%56_bA-qmW&l{Q5CZ@J diff --git a/7l_ChukarkovKonstantin.playground/Contents.swift b/7l_ChukarkovKonstantin.playground/Contents.swift deleted file mode 100644 index f291778..0000000 --- a/7l_ChukarkovKonstantin.playground/Contents.swift +++ /dev/null @@ -1,73 +0,0 @@ - -print("Проверка банковской карты.\n1) Заблокированна карта банком или нет.\n2) Хватает ли средств на балансе для покупки товара") - -enum CardError: Error { - case smallBalance - case blockedAccount -} - -struct product { - var price: Double -} - -enum CardStatus { - case isBlocked - case isNotBlocked -} - -class CardOpation { - var balance: Double = 0 - var cardStatus = CardStatus.isNotBlocked - - func buySomething(product: product) throws { - guard cardStatus == .isNotBlocked else { - throw CardError.blockedAccount - } - guard product.price < self.balance else { - throw CardError.smallBalance - } - balance = self.balance - product.price - } - - func plusBalance (someMoney: Double) { - balance = self.balance + someMoney - } - - func printBalance() { - print ("Баланс вашей карты \(balance) рублей") - } - - func changeCardStatus(status: CardStatus){ - switch status { - case .isBlocked: cardStatus = .isBlocked - case .isNotBlocked: cardStatus = .isNotBlocked - } - } - -} - -let operation = CardOpation() - - -operation.plusBalance(someMoney: 10000) -operation.printBalance() -operation.changeCardStatus(status: .isBlocked) - - -do { - try operation.buySomething(product: .init(price: 4500)) -} catch CardError.smallBalance { - print("Недостаточно средств на карте") -} catch CardError.blockedAccount { - print("Ваша карта заблокирована") -} - -operation.changeCardStatus(status: .isNotBlocked) - -do { - try operation.buySomething(product: .init(price: 45500)) -} catch CardError.smallBalance { - print("Недостаточно средств на карте") -} catch CardError.blockedAccount { - print("Ваша карта заблокирована") -} diff --git a/7l_ChukarkovKonstantin.playground/contents.xcplayground b/7l_ChukarkovKonstantin.playground/contents.xcplayground deleted file mode 100644 index 5da2641..0000000 --- a/7l_ChukarkovKonstantin.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/LessonSnake/.DS_Store b/LessonSnake/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4efdfa150bb0c29e096ade0c16d4a0a70ed1666d GIT binary patch literal 6148 zcmeHK!EVz)5S?uU-K0WT2-F_;g2W+0snU`ILb5_RMB;$t0tY~?U0c-PdZXBBfDq&h z9|3>Br|<=Q4$SNhs7Y!e4j@|XM6+*pci!558}E7nK=jA)7Jvr;5}mNo!r~00e)1(- z;TGx?W(*BE1n42WUdnb2P64OD|E2)FyX)`}5-9L@`u$A?nLdm%9bpD74|maTeK&?t zEi0N7LuP%AhFMyaoz6G0vf8+Gc}>ceY+Y%+2#)k5D8q7G^uy6JsyzzJqln`@t+QWo z7(Gdo$-Z~}zRt@q&6ANKr*VQQ&!47wtS5av&f~(26W9(Zo3gp@ZBD1%?VYyj_I74% zHSP5}ZMEIKGn+N##?7sJgM;I@@22l(A3m7}0)dN|v8#+f;WGv`BAo=IJk$A0%pmrS zv!#UF@CFW1-WY`*!U&^R3-W$J_Gx*&nvwR*RFzQ7^To!W@-ON{{Z_bzDZ5r9^kW!6 zo!B22#K!75H2%BG^>cXd?v|YbPJzFx0Id%SozQ2jESjYQ3v&cOY+$o7jOk;6IEv9{ ztSn*=ny^$vOBH;?5SEVZit~KN%A%!%;KPUDD+@lM2y=BDUzv0ezC~9$1)Ku&3ar|y zNBjSS`t$!h$<>?!PJs)hfN1OnyM25l-dmR*j`muGet=F!d6h*&!GgDA6VO(?iEa%0 Y6a|PrV`ULr(A + + + + diff --git a/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcuserdata/konstantin.xcuserdatad/UserInterfaceState.xcuserstate b/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcuserdata/konstantin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..a1be6d99790eb986053e9b5d32ca9ebb46fb1779 GIT binary patch literal 39077 zcmeFa2Y6IP_b`5EZcp9xPI^MgCcD{mS~`RhN)kGRCD|lP%7)zp2#DT`h%^BeQ9+S} zUPMGdKvcv60)lkK1}K6ZL_|gOf9BrZ6hPni_j`Q5?|YvAOW0&~dO36Ev^g`OzQ$~8 z(CJQ5h{6<2F%(O26i+#gh?;D&+RT=^kx@o#S(O>S6-PB#>PJLbCQLMyHP}2UG<#*K z#=Wqpzp2Soo@LK;oDwLpq^QBzV3N=a9yCQcQ!bPrO1Ot>Idp7b&dLw zx=#IsD8wTHxgb~MhCERi3P%yBGwOo$C=nS@chm#rqCC_e4MKy_cw|HqP#G#mCNu?2 zMNMcLnvU*6Gtm7=Mh~GU&{FgydI~*_mZ9b78T2e#fu2JvQ8Q{mYtcHi9&JDy(L3k> zI*8syhtOek1igojqGRZNbR3;Pr_l%K9Qp`dKo`*^^d0&h{eW(upV9B=Hm0#FcEj#i zgFUb(4#pw46Yh+=;I6nYF2Mb8e>?yW#D#be9*l?Jp|}Va;}Sd?kHJP*)>j3-osS zHTrdWAAN{EOdp|7&?o7$^hfkH`bYXY{S$qI{+Yf>|3d#t|HcF|K};|c!gOLnnJ^}t ziC`j`C?=YTVPcuijE+fSl9_ZSgUM(5FnyT9%q&@%b91GXPFhu8fGoCj#OYC-b2fLGfnSF)b&mLkAvq#ud z>}mEp_IvgR_9}ag{gJ)S{>0v3e`as8w>Zo>an76<=gq}&S}vYT;B=gxOXLh(5|_-S za2Z?{m(AsHx!eG5AXmr@pShdd zFWj%(ZJyy-p5xtkcV5GL@Sc1iAH+xUv3zGfj@R<(dLKaMZu$MZ&h0$;{g^3{9|Kb60qU&t@w7xPQ_C-|rNW&BEhHNS@6z`wx1#Bb*h z^6&D8_{01W{yqLEe~f>hKgFNsKjhExAMqda=lL)B%ltR|xBPefHU1`li~n7q1Ws@g zoCP1jSMU@3g#aN$2opLBae`LR3yDHMp}#Od7$_79gM`7t5MiiLBoqrHgi>L=U=$_@ zWkR`7Bh(6Y!ffGTVU93Ym?z8^76^|B3x!3(V&N&_X^*-_=5P7xKn&nJRlwvkBIMy z$Hf!k8S$+6k@&HAUc4Y)62BC`E{UpZtf@Ikxl(SFJEft#DBt0QMe)_9Cfg|ZYd=kf zMU~YUZMGK5gYuNHM7L1hl#j&7sFRdbs);gW>2xXjq%3Wk-jJqEN>9^k)6(+Nwdwkl ztQ382R&r`ecB#g@AUAKg#aeBvHeLKd$;ni`X}G$%!$mXwl~ zuhl1J=V+7iQ_{6*iH2ltR(g&BKKjJ`JVU9bbNdR^K9m*~4K>*sELJ15r<}LB#s*`l zCKR$}l{LVD-8vN=Ths)!b=zX8nP9XQIJ#Y`@o!60hSV;}clz{{xUl4u8F69L^+`Hi zTv%G7e#Q*JF~P}HFRJT$Duqg=(x`MQgX&K8pn6K~l1B27JS8v5Tk?^7*Td9iQdv|s zl|$u1I3MQLUwTwpB0VWR4dL|?3|9laD5|ndDKt(tR~liAYEyq zp=zl*$|8kH;ZlSYDMd-qQp`GP66`1&e4?ny)D$TewozyJxJt=VcXdPAH_TAz0(2GT zpeSb`f#ybAzPYBsWQ9$XS4Th`#!2>f-qd5}R%EMlF?D@Nk zk`0vGRA;O;myyi}dHYx`jrFi&b6_7D>usj;?4}YMY)Fke>4bew)CLI1w9Zb44rH4u zELKx%b82?)>C<6z=*T`vOx4GQr6#7#nBkbTnba)Gx0!lS>e5U-By}a&jWjsSSOYVg zrHsgtbuKlZ>e@`rle#ri3#2&7FnWN=X0y~4)fuZzj!cWGC#bHgsYj{DsK==#l2(eB z5+ogoAU{t-1o_cRhQXy8&vxZY3J7%A0KnTtDpB`pWhJ$W>e>Powm@ZxB=D$Guc5dQ zK=%Z-f!auIqBf6Gu{cb#X@nXyK?`1mMFSff$QtIF0Wn$XjMk=Ako|dT%b3EVwzv_6 zMS~RHLapz4YHJJ0;~42SYJ2OeU+P0D^R2gj<;EOh`B%C{oGqUH*7nUO?ls8Wp&0A;qZp{$Ca zm}1k^2Bmy)1$;Y0-JpJ^Zc@Kczru3(Y2Yc!9U+7fjTor!8seZArm296%ghbAW?OxY zu?bKj)II_xuC}#^x-O+co-%y|hIa6EyD)El^wgJ~!>Qwkf z?nqOr>C}E&l&U+-Tnq9bZTyQ|_LW9nD1hp^hN?zB$QO{O84%|nX)qwpur(-)L@$mulTa$DC>e3maH*gLaS$kgpLSwq~vDzX+2@=`3C}KRS7ajokJVz>Y%>t8cSI< z6e6@5R8Ur(W2q&GfJkeUbHp(h6{rplXjF-+kQq%x)u;y5O68JCs*ozBD# zF5hA;G))<7Y=i^Wo{xa3G7FAFR;?e72jxsxccPM^!%~OM+?v+ zXdzmJ7NbYeW9V_IPO?b#(j>_$*`x-kQJO4Gk)}#b(llxMINj9L3X@?%aTMMS7 zB_=}AcA1T-?OI9EC6|}$)M;9UR>P@pCkTp64Xe;9w1(PJQdk6E#*hJ~8`BcY^eH+G z{)?^pZ;;H6EwBmgqPlK|UHm-Sf?hyd(TivsdI@buJJ3$_GVEwsnkhXf&5|CHW=juC zbELV_JZb)Bv>WX~ub@|8x5Edv#v3GrUXd0^k4OvQ$5r|GNsE=xLb6rJiFp@D!#4FG z(BvR8$*Bc#1QR%*m+YzkRDuY@J+F2TcmF&yvD0UP5N{am= zEo(-bC{Q&l~zd4 zt->PJ89M_i@{^jSq_I$CK{+7{E6l+Dl5cGcz6QRMo((is0%6!lju^s6x8iuh{zhg_ zqLhF3eq%4}cUP1C&}5*r3YuIEO+poIOmSr9{ICw?LviF?jUE1+H&cNNNE4U}_Mb0^#1>qc=i}L^=c1o|qskcvh13Ka-y$RvBq%$%S08*6I zu?rDemk4l=I?#cQH4SFq4V09@R&yKfB{Ce1)&KC9%-9XrI`ZYe5VdJHdK-MCh(@F!|ahS>TzbWi$cP3O%+Dy z<6xr3u@R1UsL9SQC`7((oTGb=gE_KZ9fhM&Me9@Eu@r0_N3vZ^qMWlf;PRkL_9m5% zr~;YJe>)RqTWcR2pf(Hx`PGbvOD{L$kl3MUMTq^CB_O@-03Ao}eSgV9Z zH%oh9fnSl5Mz+FgWag~%9YCxOTkk4sgR+g%t5Ehe2dUhCq9ZfM>{IF>^sl=7156bS z#g?Jw%BltpbrRo)X8_JSM_t4B!*(w$YF)$urn<_8DpPeTBEtH zEgBeArJsW;9A(?mq!ZFR(rM{!X-26gp;c1Ufr`tukm}-F@n)+iOF?ev$i21MkOg!Zf^v-^TCY z1Nb0*7asyG<~4j6AE9pJBlzg(a=VbbWat1meQga!tIBZHG}hJ?Hr7rc@+?nNT{)p~ zE$t&c%BnyF0b)PvP-9)C2|y8m0Qd?8HRRQSKoW{Tlv;Lxxz40kHG$hTY@5X zfr(G3w_1qOIia1bszaDap%U7OYE)o2j!zKQYFII0=N+{=_P{E95}zWF@K+fCr9sg< zi>WoA!Drj^Mt0t%4dyx`%@+ItX{e2t`WN}tO>z!N&G;kfY#VC(6kjCh=`(yDUyweK zK9tU_!k^0{{=DQPqzAo`o@%7H=YaG-dpNV_i_1VA_y5vCDPw!0&HshX^z z)t0{_Eq^b43Y-nT1`zloz7Eu9naUA$sEJe{eI_IR1AGJjjBny!Ap5WQH++jajBn#V z@Sik=SJ0TI0iig6wF9OoR5U5!1Q>|^f)JtcHbu(QaSoxk03QwQM2J9g)hYS``)uBs z-=jk+X{Y0M33BwOjgD+3nxqWr8|ho=ybN-RgVI+rV%wosnx#2{TB$42W$A)~33HW+ zqn+`x)wB!kO1shS(naZW=?m#nD?a;QBMrKff;7Io6KR~pufuG=jStdM)NSdcbVZ^R z=%i!m&i4l17P<=o#CyT@NxB>5PRCKV>3DpQDCj1D$PNyhc&n)fkiujW2-&`tPO1&) z=|tey0O_>QdZohp#t9&%Q^llOo2AiO<`7WR$ux*@Hqt3{DxF5B(;0Mkx(D5p?nU>O zzLUO}evqz8*Q6h%>(Wos4e95NbQYo0sVF*+&Zql;cp{4KC*4%&c30_^^t+4@%!8|p zFd+>Bi-RbVIc=hRSFUW8wb4~{HRanvo9T(tZRw8|x`wWm{*(~~7>e{#Ig3rU zagGhB5<+TgR=jMbbld|UihTX5LRW#XT~Qs=Q|M`=(y4TljA$7#?W--RfDznTVW~#j zN}UkRnhGHfgdRWGRB5y|+S+Dbh3%R2gK(6#(uj7HNf2EN4QKOTq^V_R(+{h1fDTAf zLANdR98#DF3GPmG3~?U42t@z%e0l->2)$57qKuqme)uG?Kk8X0-4 zh8=i?t^wB86*k+SK>Hd1+YSRBh7eT1Oq!-B-0o206jgBrJF#P`U4N!X`+=Y7kf;>5 zSQ|j!T4puZ!-)id>DwWTQad>d9DUtLZ+39b^z$Gev#fLBX1e`wH}r9 z4tn>UlsvtM>P+vIk&omjBVQ@0b@C!Jr-vz^=4k8<`t7?4zXOF2%E+G-4ge;ibvB{2 zrbFrX=wr}T`lyV8n&F7ZRah7hCfF=BcA-64juSMfJLuE&8G>ue;p7|S!FWt?SmPl~ zGc3o){BN!BKGV1hqLZ_WtDC#V!_&*#$Jft4ATTI6s8eWIctm7W^w`3pcBTx_hhlR> z4WJJXFe^|Kh60%fx=kw>X@HhIn{cd;jf znxX(Cr-Y>^g%KNuu+%g|m=1pQNlCh}wA9qF66k71YJ0VxD*tNjn%aZG>W*_D6Cx{8 z4LVLH==6z6DP&deZQ{~wkc8%BFfP%YOiR~ibngMA70gB%sIu$S*(oV0$W;|x&~(S7 zB9JDi#wuVGlbV_bGS{qJZMH5iMXNLDQ?*Ii+4}0RrjSv)3o8MF!_2J0L9J`9w%bye3(-S{c2FF*49T@ip3_s3^(hl{Ixs@@ zpoj{s3zZ1=CBnM!9Uhy!GN>R+%O>F|#( zkWq+wvV1^)2wT>nMhA4UivEB;M{R+vNXTXf=K7falIpsF{)GON{)|3PU!X72pVME^ zmt+(wqc9nT%P2xdkur*sQM8O=WE8sr5Ze{{EBb5t8~R)NJNkS22ZG}|%Xp8BUzPED zGX6%!-^%!V8UH|VnRhmb2&?NY=DG%(VrT>;3K(Yu+J!&r>821aHqib6k!TyE+9RoY zOQ=Bo3gTrr0f6CCc+OIdZUE@4iKwgw6yxP>Vk@;+Hjty`Nm(q+el-eR1nu3PBe>D%-l^q&mH zAO$EQ_|BNanSZ0oH9GMN;&JsmW>jvUFYhf@x~O z?tfpuRP4)064N^p;Ui8TFD81Tt4MSyX2xhsl*u7QvFmGAaQw+-d0acR0mVV^am!28Ndu=3YkGN%9c?d84Zxp5Id8_3?=DBOfgf! z43klgjG%=)8RbjIBYU4;^~-oT7b1JD9egf~1YZB9q<1C>WL7-1K!Sim3o~O$9pji% zW;|n*QC}Is@zGC4{h^N6k4CJ8d{kub@Aq#yPXe#+AF(}?1Tx3Gd`yCXT1OSB!^})% zsu@5=17%bwBk1s8(vPq66VH)>(O5DE=XPukBmIAELF@?9@yOS|^PZ7O0+~Y_yM#eNZR0so z$4aJ|X<=5$s8mMdWdw^dfvm;;#QsW&-ajmlS_vg0U*EcOnG(qKYZggBtz#ppV-vHP zd7jxKqjDLUWK&Y4Q!oN(v0ST;lcFC%wE$qtIj(0a;(ID<}F}om^Woq+swQzBTL7nS5iMzV}%%IHBE&4T-MGMX);hh;QJMsqi^-b4;eB*AO|8^{JxQEZ3| zD2kYmgD6-=3uOfO`!OO6R;)z+D-3QE8UI7VV74m=gIS=?=GzZPHXaTXHi6ZVkBk<` z=n?g|bX?O(Q*J*p*i<${5dgF4(rp_OJBS_34q=C~MQkx!!U8?DR7OwA2oCe7WwcC2%VqS8 zjGmPd2tA+M$c|9qj2**{Wyi6l0B3MguTtBeji!0LAZtGhL-_QmFCj#Ge&V+l~b2Uv%$RWKN+PwzN99YtI?cLk(4 zHwC1Q{X1oRxG;bz&X@D!{J8)wkPG61xe%@s7b>IUGCConlQKFbqth}vBcro2`anh> z%IMriE?k8vI**G{VT$W2qmSA!6#%7ONB{YMLFzvOQd}y46bBNskL@7EbqA2*dT>4A z(_2QL$mmn$_h)cgx@!bYfdf+VIJh1Int84d0j>*xd$@iCV_m!pwmh(d@8$+^Lsjq^ zqJY;Ie^biQ&IqoIK-Wla6gQe1!;R&}ai!dN&d5!W(U&s1EF(auz@7se1PJL{8GR?C z?`8DEMy|XSy3BUy0_eZm23TT|z3R4FFrZ7vO;}F0U=I(|m z`Yi{59OF)?Fa_rqEo0$tN;!&rzO<}v_YwCo_X+nY_ZfGdyTDzPv6GCQW$Yqj zfD1PnyUSQ3V-Fd7%Ghfo_eCpAeZ_sveFHG{os7NPV9H;{K{5^|Ko#;|p!&}ss^17u z-IB471E~HW$KanlMLsh2m9d}t8;-$&8pgipJkL8Rz{QIMxB>u7coza(fp-HJ-#s!j zN@WW*Jsjn|cwYt1cpnAMI{i%rjv~Q)C}_I)5WbU)!(<%M!iVwUGLDil_(5o=u;ODB z=^PF()l~e0vcUwRK98>p`&yfOjQc9bBuM9i9?t6VrxZY!1n^M<9o}v zt8{!+_AtFRf2ektwV2%M%O2F&KtyjHOF4ibm(K@93ZExqZ8P6T#_>x3iP=N{I=Cy_ zuIzAgc|%oXX8m~u^c>{}@I`PnnIFg(@`L!n{1ASqjCC^B%NVB0Ambz%C$Hs;`4WB@ zKb!}#mW)$m3^SG{<8&Ek0CF;n8U?z^d?Rt0GCBv$Bj8>gvE+cx6P-6)9k~rW-&@N1uDobwzT$Dot(k;+ZO|gJ*^)}%pyKJz@o#{)(p8_Vw!9Q(*UF6+EZlj zi?9AL{nMMTfl>VQ^yGMO?UR%YrdV(nHA$~C#D(dT_3`P+X({RYbiFPqJyoBmUL)ko z+os+zD^oT6u%-@i4c}HOTO$D|xF#K_tnbe!C71~;KLdj*OGZBjv7h_4=5-qF3rm=C>}Jlv?y;t zUQThrpu*Drc_YEB`>qVb3W^G{2jmTfTxyoP>&P21I13Di9d)$3GM<)_Mw}(3+pmlZ zfdFs<(9m_#bOi#1PVKLE3*kZ(kW@m15GiA@nzObD(E<<)4KkkFaboRM&7@Kf`jlf? zYc1uC%Js8$R%rc+t{B#~uCfs>fAmz%snk73ZiNi6C&U*KXFxIb%|@20r*ieo?mWk4 zzY+=CCxL)IoUyh9H~>vG;GoBvFc@yrfX}E}TY`CT75J7ZGS@ajl*I~bq^7jXT$J1Y zu6%k!d~&?4ygETOI7=8{o?wNm#|inwqY$yUvL&>QslpMNK(ycFo?VeL%J`}nMfb05 z&7iG^i=eiici+Zy)ZaD)Wn!S0R=5>ZPOMMcE1k6!RW-({hH16ajJB$&w(^OM^$k<& zDkn`dH8f32P^<$JfEX(W&t_y=hz*yyo=k+zF%i*;y8jpE6Rvbm20Er~TJ1AdrA*|1 zr>oIsO&}LWYZA;>H7%tyB}of=q{gH*TWlnU zwiN>0i4=?#I(EQUvO~>LrDlAc#{BdQ; zpCC)Vlq~tuyO-R1tE1F%fiU?3F!@h43&7+r>qrILnf#|qH6{NbdjT9YkjC{OS9Ek^ zt+0`B7wd%e!Uh>Hmoaqc*;T?OVY2|-J@jk6j5iS2iBryS$HfTs#)U(c=eVKZaMobE zcXn_IHQ8)wv=u8xUpPI$Uto?m{4bhhW>X^>gh5dxf*(baq<5e!!_ z+Q}M(F9f(N*DPF;@e9quWf{NNv1Qfx8gIR`<+A^A%RdNLJGOjXxItR}NyaZV3qQ+v zN5_^`lVrTTRMWk~n8~&UV)=hK?mvV-JG3rhk%87lP>{XcEV44*-Jx~SNuBXs;I+I% z>vigVp8s(NL|4(RV+TA$@B!Z}ddm2fX3<;5U@b-bS&^&4>b2MQFlz@KF+c{y&$Vm9D>vA38hX36-djE~9q{Z(R) zm@DSV__&NguJsYY`8rtVj+Z#?7d`>K7B$uqA8INH6qzc?Vpnjw*dIx2!~xPB6esXGzzIv;U6$=+ILT7g*qCC9Gn%zt5NrzITdD;15pqYv1MX zbE|DAP8Q0juxLz$-D`795G(F62(ePEBJ=;DjL#|aADO8Vm(-B35=9c@SU-zsyGMC8 zP;3+@6C->4iHtv$3_~;S+4^+xfqRr@riijQQ$|HHJ}-m6B7?pEisJ)uHhpH0hwu73 z9UlDepB)m!Vynf{0B;UyBAi{kyur~y*KP^jd-UuT-8%K*|uyW6K(^;r&g%d;B51<{1Y29pgQqX?JikwuMVWhN8&oj>X0>*g02a*zA{ zE&c%#Be5+(!SJX=u;c?*v-3gz2RXs@mc@FS_+4;|jsdp>kU}oQY10|7k zRhOKxTAyf0BJW#(&jHufDXD4c= z>06*a6ah{eps1s9@<4&5ooW}fDXpo*OGukKMMG)06N85gExMPVgN{xEh8DMaIe-$w zhTrMDci4zxSUbgYFW^*lAY}5D(E_qoWAbY2tBf|7JvAO`8Z%azRmWZZHkbEfh89C| z>3BFi?p(N4#tEQ5zAGA{R3K_wVyL0qWCyL5^5WB#RpyCq)it$s7U=BoDp29VC<#&p zkt*O%0QG@{f=3LWI(QAJT6AU&(E!2qGP;P|4?(5#UoMve;OKL)=Ge&7>6o^m&q z+3K?f4<0~(nD|gvfw}$fpU+T;d_Sp(0o$ki8(|jib(TTCeeh{2x0TgW6zV}y{FSnL zYXe2W$q$z!r!>@)a9;>}R~HY>f$$iL5?t(MA({&916R+j=CUw&GNdUCG?ul-u*CSp zFc47_a*Jg7XaCjKG?IRkf1&Vku~irKhrjXA|5@e6ToO)$@U}8zUXeZg^aMYW|r z=|cp>Z?{b@BJoO}r&Z;UenMN!nTf`JgCPt^jQPn_(}(1Tdf34FhQXvx_|E3m)fAF; zGa5Hz=dSA=JkOv%oV?v8itINiL$^mb0&Cbt_~iF3!`lCkjZ2v zR0$8z)xswXdJqSnK9H*pK32$KqpBgk62g~S)5&*If|RL;6bn3CXNCt+`n1M|DUaEy zga;-YZJIW%l;sp}m|=Yp6y@ucE$%^ePAqq|PfbQ=xyg@I41&8zHR{!tGm0 z1UO2h1}lA4`#{o3D__}Lu|SD(r7g7_86|mWkJM>~eA6I}^i3H#_@&S>2KaP`tLr@( z9mMy6dW=*PrB&j4C~=Nf+eS{t_El@Elc2Ap1u|=7^d#h%FUK6e0rS-Wu{AJ4ct%Fa zWrN=Q4rQwCrQ4T*aV`#Q>|9^Jbm5SKach+xld*@*w3eF7jxD-sANRdh?e5mK9oB77 zd$>>_rTi|qfVS8Z?E7#D;}jJJf4_i-)~-N^T+R5H{jjw^gQ5Qpcp!7H&Os&2gZixv zvdWYgvKBS)L)PW)ezvWdS`W$7t_DOa?Gl*HQfeWoweTS;Yf|P^UB5;MH^8b?D5bRk zF>SrP6QZED1NZIqr^3!G*!M0Kwpp|LVC(3@PBXj4oOC&GUq#*G!20@eYwx>ds&7jr z>tK4g@aIBmW}I%T?pxhz-Dcf&-KT9ibZ2$n=}zmKA>|wTaq!ypD!rTDLm#2S;M*Sh z4e;VcLYwKm@bhA8xsDL7&Ot{AC-7EghiEcG4R)An5Bu%+IGHcUY?1tqm74e$@Y)_? z$cp`YJ!-$A>aKI_33YXpUFR0*rg!7ry1FI1Ww{}@aQI1d%Y;y*TZG#HH$O=2>lW*l z>lV~HAAOW{B>hl#s9E_-_DdTU8wsfnNFd{@f;6j=!)PCG`~5{=C=4F!Y{O>+qnX?9 zD&z_~Q*BAb33oz{vLD;kPy;Vx!7C@!6zGQ)=9TRBI>04i9r6%NOt26@B)qdh*6$E}sg6hZ7+lo>1%u;dGL#0bI_)c|+w`>YJ>@6?9k@QFewE z)Ro1@g(ZTMFp45H6UjqS*M}&y5b`|&UREcoaSZvxQcgfmdBfwWov27St+gm>Kk|z^=Il9LWqaQP~kBe@PrkOx`8LGG}H?`Uk!jqP)5QNsFkP=HNvB( z55jX5kHJHy&G4w{i||6i8}Ov*ar7a&fWAUMqTk@bQWxwE&y>c1clI=#1rL-KkdO8(5O>~l-o^sma^tRK-PS>5CoggSC<@@F)ocR3tiT^>~s0h<+`h@Ym95A>nPU-*M+Vd zT;Fv4)b$rPFSmHN0=IIv2i%ss?Q}cg_Px949_^mxKF)ob`%?Fp+>g0`s}VIZnjDQ$ zbH8S}X1C_7=7xuthu&k5N3F*KkBuJhdR+13J!3rcJj*?2d9Lz&)AMsL+AGp4$E(ci zL9f+bZ+l(x=DcIQ3%n6L-A5WhopJ6^zeU|&Y>T}+g_Koo^@U8J(&+~u5|Fr*a0bv1o0o4JI2D}{bNgxy0HE>Aa zl)x2%ZwG!G#Ks4Qq+(6*p+!8o{U@X+At!K;Fg1m6hh6w)W8KIG|;H$%SdF4Zjr;8&MK5 zGvbAaPa>Tn(;_P(mqhN5yc!i6H8ASFs7+DlqQ&U6=&I-^qYp&ijERjI9`kU_%Q07C z{bLJar^RlH{kXGh=iZ$sb#Cc=stea8txI*6XS=-L6?aYUTGe%V*JIsqx0G(?ZqIf* z9>>O|$JNEP#GTc;XtT7FwVSjT;(g->#LtX>IsW^EsDx1ok0u;Q_(PYhtAW$)BfY1- zpMIu(kN(HRu8C!d%M(u-Tn+h#2MoIm*OIy=nUYo{eUR*xJTUp;7TyKn4%rAKTJQ;*d> zKJOXP)7Z1Q=lNb?y~g)i+3S4o@ZQGWExj*hMrM|0uFbrh)g^0U*5<75vvt|l>>b%R zb24&f*B=?!#XJ22oZ~wlJ_B~q=QczZ~ zq2Ox2)P6Jiz182Pe^LKs{VxvaI>0($&pBKPu^5(pa*8nES9X!!``NIXrjx zW5dsnNEk6=#Nm;FBh4dsjp9cQ8?|=SjnR3dpBQ~|}8`=&gzd`bCNrksCr%XpEbj4UZ@pn$Jg$z^Q^0`d&|_v2)`?jTa{On!J4SFH?q1d1U$OmRUa7pSTt(TqT zYWcmHx|xs7{OQ5r5AK;2GE18E`9pmk+BDm3wsrQ|hr2)g+#F_(dCt+fhPhAA{bOGF zyhHPK^Ow&5eL>lRLyzbmdFqir7gj7hx+rDQipAXGy2WQ6?fvNb$2=aJ_Sol-4}5&* zlCUN7mi+WY=@aiRO1xR-LPR}@Ww@(@TSI1Uu_<<`Tgf}pWn4byQTRB-xua@rM5P1{rbi6FP_=f zf7||-(q7uKJ$m~yJG^$x+lh8I?Y#PO)ywC1jofv7cfZ~H_jKR0o@k*@B8+R$~QjWU%LOJH%GjA>a8Jf9eun1+Xvstf9K5uSqEM} z*z@4tcQfAIeJJhF%ZF1A?>v%xWXF5S@9j96a&+gh)MLBePk(>U@gB!tJJI{Z8z*y5 zzH_SJ)Zx>Gr;nd0IrG8UF=x+zQ2xP{4{JWWc5d>yTi{Kd{dnFdnopK~8vJR?XI(yf z;e5*ZS1;sVIC8P*;zysCeg4fCwl99aH0w*(FPB~py}aQ{;+4H$<$v}5*Q39_^iBOY zx4xbIoyT|2eBb%|?LTDxaOCQUtCy}>ul@Psg6jd-*Zq|A)BYQSZ+!Z5?a#Mv&if_c zm-WA<{d(ZH;lEwJHRX5y_or@mxxMF){(pS@XYHSVf~==$S_cVE%k<(7-yz40`yCR- zmKj98B*}`Hr&ZQguF5uBW`ckT#6Ne&gT$tzr_2G=5UL2gW!_IcL@fj=q6KJ(weY<9 zHflFe5J#wE)N$~Ta0Z?_JV$*DuM~a*G{kMh0sRn&B2f(L46nw;p;XiZXou18N?JL* zJywlskp-R^n+#8=PXkKgek8%e>ATU#=q5aM{s+8rgRuzIgBy6!^uj*a4+p@DE<sJFMkfN!@Kcud`5Ym{01$6!}U-)5xi;kqO;&h@?zRZ*U=Bs zvw?jp z{@4D;2gKMR4q5qJaWUKg0ENMPae+8YTquJ51gH%@m+=>%Igs%s8GpH!9f#f!9~YMZ zjRcqTH-Nil3>wC-;JK*9M3)fp_dtRRXlm^0aVg`cQ1~c{)ddOD9%X5X0Zh%kfiPwv6tN?*DQi9z;|{h<K*w&zq!ZddGl)$q%B*+y{f zbrNW*SH!*ItKw_o>*7A~4dUC&CgZCz{!zxDNd-0PFEaj3#=pz>5Ae{?=59%RN7ZOv z`-h!cwRx8MOAlV+VYTV&|7V?AiSMh;-uO?ucxpGvr`0BJ{=<{}Z+H$9uS`hU=c zm-w05=B@u5*Yw0M)W&cBhwsF+TivhJ7XK{O%y1Y5m?vnK zxBa-ow&Z{Cn#*5bR)o_k0OZbblpZ9!z2T%929Iiw<0f!bTq8Gwo5L;QmT*hCr+}w> zj%(pobBDQ$+z;FzJjG+4;W=L5op={M2rgoV^5J|GAH#R%yYg{-cfOoo!@tk}2$v$d z2-!l8Fjz1OWr9hl6wE@kP%Bu#ly0UlOPDRp5#|XCgoVOl;W1$e7&`3%Ynji5t6-6k zNEG0pa2_p=6-z~Jl*+z z;2vi>FL7>mUhTZrd4uyN=jWYwJHO+6%=x(UN$1nfXPwVGUv&P$`Ag?3&R;u!<3hQ3 zxrDmJx#(RCF3Bz#EeZbKUN` z({-2Y9@o9Dr(J(?quhKz!j<5bLcGX>Q4+AbZ-hGgJv3sNYO!r6J7r8&`{%QK7qx)v}E$)Zhzj6P?{g(S}P!(bgqw&>5YC3DWYT`6{jX{$Pc9{J%rJ5SeB#lke zsF|j@54dOvTu!ajtkJB~Y|w1cY}IVjY}dT2IivYd^O5FL&3Vm5%@3NZnroWt9!?&9 z9#I}K9-Te9dc=9ed+0oRdi3_l^2qVX^XTJI;L+cs+T$UQ=REd!oc6fran0kp#|@90 z9>03r^0@8sr>C2z#?#Z&+tb(6-!srN*t3&of#)R8$2>QBe&*%nmF|@dJbIp2q1RZi za<3Y%Mz6(Qk9jTeTI%(b*D|kXyjFOv^lAbAeXZAeuZ>=tyc3i_P6>s_)qqq>i>Yh?Ej$uL;er@FY{mJzt#V+|9k$&{Ez#e1ewKI{}25?^8dvD zGye#;h-ZyM}s~O`Z<^l_76@9P6~xG8vc@SNaz!3%;H1}_eNEO<$9 zbMWTiZNb}vcLwhYJ`{X1_{ZRzA-*AzA<-eRAzeZeLVASs3dsz~4jB|OB%~;$BxFKJ zc}PV_RY+sVl#r&7=^+n?EDm`hePa_ zQT?L^L={Gjjv5~|A*wve9911v7gY~3s`*h%qMnF)GHO}Ws;I3|JEC?)y%M!AYJb$* zQ3s;li~2a)CE6!CE?OVmH+o34Il3--cJ$-X&qO~L-4eYfdVTbZ(c7b6j@});H~KY@ zaD5j2b@Wd$D8?zqHAWNT72_Kd8WSE983R@*F4JFnYw-CDYB>bASvzHSG)o$7YE+t=N`>vpx< z^=?0R`?cHe-TsWjaXxW=ae;9maba8q?{Plzokj*VgcsJp;E=@OC_n>Z$ZoY1z?s45x z-P5||y7jt^prv|2cS?6b_qpzp?uy=3AE=Mi$LPE0L|@=6L$>XH0;8Qq$^3^B>kTBXEIJ^lZ9mGWVd9GWbb6( zMJbP^+(^Z#Oe&WurkYbH zr%p|smO3N#a_Ud1Kd1hZdMj;IT4maOX%D2$OnWG8PTKsmg=vqbElGPaZCTn2Y1`7a zr|nGJm9{7C)wF$SZ>GJSb};Qw+U0aEy=(e_^!oJ2(s!kQoPH}KFe5S}CZkJ6w~VBW zo*9`LIT`sG1sVM_24)P(7?WYlD9fnGsLrU(sL!xw$QiRT9?4jg@k~Z@#_Ei98Jjb< zWW1R1QpWy_V;Ns$T+aA9l<@AB}{iB6o1ylWb2rm3VQDPB$pi5kiy6^|IH zc}Yb{&pwWie))d>hxhaG_`dFEv}UwrJoUtR`goE&|M0x*N%jo%4DzIU(mbzwhI`)h z1U>J1R(ZbmocBBiUInrM1Be1kffc|?U^P$%YydU`+khRwPGC2%2iOZ#0Y3sqfoh;0 zXaFt(zXDf*W}pSQ0knY~!FaF}*cp5gd=(r7rh;kUaBw6z1{??C;COH{m#IMil^_SSpb;A9wrW!Q?X)w%Gy@GQ6hj>7ZdVt5g}1pXK( zK@>zq<{@RsVdRQ0!I$b|eINK%`YL?i`VRUI`M&p^@cryN>-)ub(f6zGvaiYaUthED zPv0Y7o9`*w0gXo!(avZR+8-T)rlTX!QD_DVpb!e9K~zHX(CO$bbS^p%EkKLV;@HZ* z3@t&|qnpqz=r(ja`W3nh-GlB$zeNwC-=P=K$62pr!C8^4;;b*TPG|jrb;tT*{jis@ zWGodMfsMpQV`H%l48RDC!Gf58Wn&XD2~)7C*!$Q#EQ&3_7GcY=5^NQ=23vWiM(h&SgtcOA*b{#{f1JOAKf(XJzl*<{zo);K{|!Iu|G>Y-zt7)* zx5ra(6xZ>0@OSY%d>WpQFTfY#i}9uSa=ZjD!^`n?_(psiz8$Z?cj4dTRd_9a7XJmm zh+oE=@N4*W{2|eiNQ$XJGBJ=CM5GdFL^?5o7)6XFXd+1Pgh)&vvWXBO6KYHrOu{DS z6YGd$#BXFb@(pqVIfpDI_mYRnBji!Cnye)o$VT!K*+gC=uahn04e}BBlxk0Ppc1Lh zR5z*z^$InB8cGeLGAM{bs4R-40u)PeRG7-8@~G+5EGnOJsVFs{T1l;@KB7tkae?lE zo`GJ0-htx4>OfgwZQzT*hQQ{)&cN4!y@CCK%D|z(g}@(lZ#tbGOMB={+DlV(gwCU< z)3fNg^gP<7Kc&~xJL&J}@98S~7=42N4}F?$q%YA;^fmf7`UZWAzD>6=otOa(!RX8k z#$mQFyO=%9K4w32jHzahGbfod%w?v9xyjsS?lBKydJ@NWWIM5)*{*C7+n-Hl2eO0M z!R#m&VY67ArC5gLSdmp(gSFVnY%cpAo5xOL^Vv;o1-qO5hTX>=VNbKQY#n=sZDd>6 zo9u1&9{Yf84aNsM1)mRg4NeNq2+j=73eE`@2NwsI1xtdff@^~1!F9n6!OdI(_ac|V z4d#Y&uXDq>k=z(Ag9AB+<2aFfi<`(vT$s~2le4)(ZaMckcYr(2UF2?YfAR5rBHxAY z#;5SF$Gm4GKboicTz&>0<%{_Fd@;Y8|0n+mU&gQH%lX~>LH-c`17F1-%@BToOo5d zCSDhR&pwiUI=e3WO!m1@X=p=ef2cBaICLa*G;}<4DpV7y3)P3thi-;$hwg^{3_S?7 zh8~BWjPn2iNW%76O6{VvxRAH5=$};5>xp_7y_?=o@2|h2 z572Y;N%~}cik_>_(ergzkLnBbh5DM9;+5*3>c8mM^k)6K-l9L$AL~zy_C^OI-sok# zWb`qTjF4d)lZ?s6JH~9|L&Gr&jrm5gvBvn^*lrv)ju=Oce?l*rnFPhC}i+R($ZQe5W(7YO!uu_pOK46T7qhg8h=+*Y0Nzuv6^8_E3A6{e}(L zgdMa6dxHJ89kzAbv?tk9>^ys}^O`fn8RMXi-yt2^2|9u^!O&za_w zI+aed`-0og9q6XH>F!t;a#2@s$Gftty1E;2^W5p~Om~i(?>g>6cZs{qUEzN0mb(9P z*TvH6`(xen!|sv)C%R9$HL=cYeXKovHI}};?*3jN6od=30;9kxI9_nJ;Cw+tL1Q6U zNEQYPnL@5`Z(&v8(ZcG&lhL&3xTq%zM!nI^(LK?<(Ql&%i~1D}E*eslR+RpXS>ocJ O-Ncq>_wTo8$NvCZZiBG^ literal 0 HcmV?d00001 diff --git a/LessonSnake/LessonSnake.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist b/LessonSnake/LessonSnake.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f940495 --- /dev/null +++ b/LessonSnake/LessonSnake.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + LessonSnake.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/LessonSnake/LessonSnake/Actions.sks b/LessonSnake/LessonSnake/Actions.sks new file mode 100644 index 0000000000000000000000000000000000000000..053052001e4f4fd4d597c1c74f1ab1919ec27642 GIT binary patch literal 1892 zcmZ`)Yj6`)6uz&eFQ92@dGy_G5(=enKp96$L5ff*(6lru;IeI&c1yYm*-fOibnb+L ziXbnkh*;Vbc~r*AOL@vLhztS(Eh-2K3jT3q#^DDlI*vCFpjFt+-Fx=z-gC}(zVF^t zIc&13<>Xv}2or9=_dl5RZpo?2cEzl>SJg??nrhLD&gxp3xy$sL-4PAo%Jy#ExRB7O z=;0$qjm{X8nUz1WVA9l@TDfkqtzNM^URk~7t+ngczrESpxqbJc!$*#v{qo#bm#=+y z{YJT7aoKFWVc`)22kRh)+mNN=`{lyd%r-RrS+&|N#FSadQUV85ii(Z)Lojir=Xgp25sf#I^mi%JG^u!s( zDK90>ESWVseojKEiRVofW{c67zTjnHp|OhRCDS|~Hp#}|yCp#v&7R6cXN{zpHl6qjc~w zO^^60c+l0=&Y0pK8ex^M=H}##Nny8TJxiRbRvFNpBGyahfGMdJrec2&I#rk3Y$`7F z3(;I+n&saXPvL;~aj>kJao}0*@fbZkzslsVHh?CDCI!(X(?pugej#l5uqHea4dM%e z66;^_hK+3V6gr(^gLi|QA=uPf$*Pr>xFn@o>U_uL?(_Iqi|;ZmzHivZr&D84a(X5? z1Iyk=+z&g+B=nU9kANsdi(Vlc;w};)px&M>h$e%Kt=8c|UIN$CZ z!@_0y!zDj4-1!TP&S_4&%h7q>Ck6S(A!oZEoOf^keleoobaeyEEu6&wVy4H$NJL0wCxjOH9R5gJdlX z9-cinZ~gdFxgaZx>}5{7U86Y^vM-}R96L}lK^}Mp*ntZ)ffle9w1UlG3)l+UKs(q4 zy1`zs9~=aqg2UhhxCE|&+u$zv6A~B+<6$C9hN+N;1~?Lqf*Eiud>$6TX>d9$fpee< zmct5I2baSY@HO}bd=svLYvFph5pIHQa3|aYyWw8AA0C9a;I9ax5Htj(pbRtx%|SA9 zqZYIdwW7^v3)+g>P&@LX?Pv$ug}Trl^bz_P?L!C9C+HA5f{vlj&>3_I^`PtM4!Vo( zqu(*YAvhYxV;+yhId}rL;zhU?*I^r0umd}>hTV86Zp2Nv8B^@REqEn<9k0Tx@h04c z+wpFE03XID@#pv~zJjmf+xR~I13$oj<9`Ssh!8S>gpw!{N0Lbz(Gw#{Ck12%5s5+^ z#7Q*bCQC^pX(G*p5)Wx1Ye*}3k9f%ra-5tXC&?*tnw%kL$vJX?TqKuCFS$W}Cclt- zP%{{=8& BT4?|P literal 0 HcmV?d00001 diff --git a/LessonSnake/LessonSnake/AppDelegate.swift b/LessonSnake/LessonSnake/AppDelegate.swift new file mode 100644 index 0000000..93a499d --- /dev/null +++ b/LessonSnake/LessonSnake/AppDelegate.swift @@ -0,0 +1,41 @@ +// +// AppDelegate.swift +// LessonSnake +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> 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. + } + + 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. + } + + +} + diff --git a/LessonSnake/LessonSnake/Assets.xcassets/AppIcon.appiconset/Contents.json b/LessonSnake/LessonSnake/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/LessonSnake/LessonSnake/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LessonSnake/LessonSnake/Assets.xcassets/Contents.json b/LessonSnake/LessonSnake/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/LessonSnake/LessonSnake/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LessonSnake/LessonSnake/Base.lproj/LaunchScreen.storyboard b/LessonSnake/LessonSnake/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/LessonSnake/LessonSnake/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LessonSnake/LessonSnake/Base.lproj/Main.storyboard b/LessonSnake/LessonSnake/Base.lproj/Main.storyboard new file mode 100644 index 0000000..2cc971a --- /dev/null +++ b/LessonSnake/LessonSnake/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LessonSnake/LessonSnake/GameScene.sks b/LessonSnake/LessonSnake/GameScene.sks new file mode 100644 index 0000000000000000000000000000000000000000..4fe4d9f41e763cb136277f8a00e3f7ce3ea3daa1 GIT binary patch literal 4694 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 literal 0 HcmV?d00001 diff --git a/LessonSnake/LessonSnake/GameScene.swift b/LessonSnake/LessonSnake/GameScene.swift new file mode 100644 index 0000000..a86f487 --- /dev/null +++ b/LessonSnake/LessonSnake/GameScene.swift @@ -0,0 +1,155 @@ +// +// GameScene.swift +// LessonSnake +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import SpriteKit +import GameplayKit + +struct CollisionCategories { + static let Snake: UInt32 = 0x1 << 0 + static let SnekeHead: UInt32 = 0x1 << 1 + static let Apple: UInt32 = 0x1 << 2 + static let EdgeBody: UInt32 = 0x1 << 3 +} + +class GameScene: SKScene { + + var snake: Snake? + + + override func didMove(to view: SKView) { + + backgroundColor = SKColor.black + self.physicsWorld.gravity = CGVector(dx: 0, dy: 0) + self.physicsBody = SKPhysicsBody(edgeLoopFrom: frame) + self.physicsBody?.allowsRotation = false + view.showsPhysics = true + + self.physicsWorld.contactDelegate = self + + + let counterClockwiseButton = SKShapeNode() + + counterClockwiseButton.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 45, height: 45)).cgPath + + counterClockwiseButton.position = CGPoint(x: view.scene!.frame.minX+30, y: view.scene!.frame.minY+30) + + counterClockwiseButton.fillColor = UIColor.gray + + counterClockwiseButton.strokeColor = UIColor.gray + counterClockwiseButton.lineWidth = 10 + + counterClockwiseButton.name = "counterClockwiseButton" + + self.addChild(counterClockwiseButton) + + let clockwiseButton = SKShapeNode() + clockwiseButton.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 45, height: 45)).cgPath + clockwiseButton.position = CGPoint(x: view.scene!.frame.maxX - 80, y: view.scene!.frame.minY + 30) + clockwiseButton.fillColor = UIColor.gray + clockwiseButton.strokeColor = UIColor.gray + + clockwiseButton.lineWidth = 10 + + clockwiseButton.name = "clockwiseButton" + self.addChild(clockwiseButton) + + createApple() + + snake = Snake(atPoint: CGPoint(x: view.scene!.frame.midX, y: view.scene!.frame.midY)) + + self.addChild(snake!) + + self.physicsBody?.categoryBitMask = CollisionCategories.EdgeBody + self.physicsBody?.collisionBitMask = CollisionCategories.Snake | CollisionCategories.SnekeHead + + } + + func createApple() { + let randX = CGFloat(arc4random_uniform(UInt32(view!.scene!.frame.maxX-25))) + + let randY = CGFloat(arc4random_uniform(UInt32(view!.scene!.frame.maxY-25))) + + let apple = Apple(position: CGPoint(x: randX, y: randY)) + self.addChild(apple) + + } + + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + + for touch in touches { + + let touchLocation = touch.location(in: self) + + guard let touchNode = self.atPoint(touchLocation) as? SKShapeNode, touchNode.name == "counterClockwiseButton" || touchNode.name == "clockwiseButton" else { + return + } + + touchNode.fillColor = .green + + } + + } + + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + + for touch in touches { + + let touchLocation = touch.location(in: self) + + guard let touchNode = self.atPoint(touchLocation) as? SKShapeNode, touchNode.name == "counterClockwiseButton" || touchNode.name == "clockwiseButton" else { + return + } + + touchNode.fillColor = .gray + + if touchNode.name == "counterClockwiseButton" { + snake!.moveCounterClockwise() + } else if touchNode.name == "clockwiseButton" { + snake!.moveClockwise() + } + + } + + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + + } + + + override func update(_ currentTime: TimeInterval) { + snake!.move() + } +} + + +extension GameScene: SKPhysicsContactDelegate { + func didBegin(_ contact: SKPhysicsContact) { + + let bodyes = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask + let collisionObject = bodyes ^ CollisionCategories.SnekeHead + + switch collisionObject { + case CollisionCategories.Apple: + let apple = contact.bodyA.node is Apple ? contact.bodyA.node : contact.bodyB.node + snake?.addBodyPart() + apple?.removeFromParent() + createApple() + case CollisionCategories.EdgeBody: + let _ = contact.bodyA.node is GameScene ? contact.bodyA.node : contact.bodyB.node + let gameScene = GameScene(size: self.size) + self.view?.presentScene(gameScene) + default: + break + } + + + } +} diff --git a/LessonSnake/LessonSnake/GameViewController.swift b/LessonSnake/LessonSnake/GameViewController.swift new file mode 100644 index 0000000..28e5643 --- /dev/null +++ b/LessonSnake/LessonSnake/GameViewController.swift @@ -0,0 +1,46 @@ +// +// GameViewController.swift +// LessonSnake +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit +import SpriteKit +import GameplayKit + +class GameViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + let scene = GameScene(size: view.bounds.size) + + let skView = view as! SKView + + skView.showsFPS = true + skView.showsNodeCount = true + skView.ignoresSiblingOrder = true + + scene.scaleMode = .resizeFill + skView.presentScene(scene) + + } + + override var shouldAutorotate: Bool { + return true + } + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + if UIDevice.current.userInterfaceIdiom == .phone { + return .allButUpsideDown + } else { + return .all + } + } + + override var prefersStatusBarHidden: Bool { + return true + } +} diff --git a/LessonSnake/LessonSnake/Info.plist b/LessonSnake/LessonSnake/Info.plist new file mode 100644 index 0000000..870f784 --- /dev/null +++ b/LessonSnake/LessonSnake/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/LessonSnake/LessonSnake/Node/Apple.swift b/LessonSnake/LessonSnake/Node/Apple.swift new file mode 100644 index 0000000..fa689fd --- /dev/null +++ b/LessonSnake/LessonSnake/Node/Apple.swift @@ -0,0 +1,33 @@ +// +// Apple.swift +// LessonSnake +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit +import SpriteKit + +class Apple: SKShapeNode { + + convenience init(position: CGPoint) { + self.init() + + path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 10, height: 10)).cgPath + + fillColor = UIColor.red + strokeColor = UIColor.red + + lineWidth = 5 + + self.position = position + + self.physicsBody = SKPhysicsBody(circleOfRadius: 10, center: CGPoint(x: 5, y: 5)) + + self.physicsBody?.categoryBitMask = CollisionCategories.Apple + + + } + +} diff --git a/LessonSnake/LessonSnake/Node/Snake.swift b/LessonSnake/LessonSnake/Node/Snake.swift new file mode 100644 index 0000000..1557ee4 --- /dev/null +++ b/LessonSnake/LessonSnake/Node/Snake.swift @@ -0,0 +1,80 @@ +// +// Snake.swift +// LessonSnake +// +// Created by Konstantin on 10.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit +import SpriteKit + +class Snake: SKShapeNode { + + let moveSpeed = 125.0 + var angle: CGFloat = 0.0 + + var body = [SnakeBodyPart]() + + convenience init(atPoint point: CGPoint) { + self.init() + + + + let head = SnakeHead(atPoint: point) + body.append(head) + addChild(head) + + } + + func move() { + + guard !body.isEmpty else {return} + + let head = body[0] + moveHead(head) + + for index in (0.. 0 { + let previousBodyPart = body[index-1] + let currentBodyPart = body[index] + moveBodyPart(previousBodyPart, c: currentBodyPart) + } + + } + + func moveHead(_ head: SnakeBodyPart) { + + let dx = CGFloat(moveSpeed) * sin(angle) + let dy = CGFloat(moveSpeed) * cos(angle) + + let nextPosition = CGPoint(x: head.position.x+dx, y: head.position.y+dy) + + let moveAction = SKAction.move(to: nextPosition, duration: 1.0) + head.run(moveAction) + + } + + func moveBodyPart(_ p: SnakeBodyPart, c: SnakeBodyPart) { + + let moveACtion = SKAction.move(to: CGPoint(x: p.position.x, y: p.position.y), duration: 0.1) + c.run(moveACtion) + + } + + func addBodyPart() { + let newBodyPart = SnakeBodyPart(atPoint: CGPoint(x: body[0].position.x, y: body[0].position.y)) + + body.append(newBodyPart) + addChild(newBodyPart) + } + + func moveClockwise() { + angle += CGFloat(Double.pi/2) + } + + func moveCounterClockwise() { + angle -= CGFloat(Double.pi/2) + } + + +} diff --git a/LessonSnake/LessonSnake/Node/SnakeBodyPart.swift b/LessonSnake/LessonSnake/Node/SnakeBodyPart.swift new file mode 100644 index 0000000..7bdb037 --- /dev/null +++ b/LessonSnake/LessonSnake/Node/SnakeBodyPart.swift @@ -0,0 +1,39 @@ +// +// SnakeBodyPart.swift +// LessonSnake +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit +import SpriteKit + +class SnakeBodyPart: SKShapeNode { + + let diametr = 10.0 + + init(atPoint point: CGPoint) { + super.init() + + path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: diametr, height: diametr)).cgPath + + fillColor = UIColor.green + strokeColor = UIColor.green + lineWidth = 5 + + self.position = point + + self.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(diametr - 4), center: CGPoint(x: 5, y: 5)) + self.physicsBody?.isDynamic = true + self.physicsBody?.categoryBitMask = CollisionCategories.Snake + + self.physicsBody?.categoryBitMask = CollisionCategories.EdgeBody | CollisionCategories.Apple + + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/LessonSnake/LessonSnake/Node/SnakeHead.swift b/LessonSnake/LessonSnake/Node/SnakeHead.swift new file mode 100644 index 0000000..ade1668 --- /dev/null +++ b/LessonSnake/LessonSnake/Node/SnakeHead.swift @@ -0,0 +1,26 @@ +// +// SnakeHead.swift +// LessonSnake +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + + +class SnakeHead: SnakeBodyPart { + override init(atPoint point: CGPoint) { + super.init(atPoint: point) + + self.physicsBody?.categoryBitMask = CollisionCategories.SnekeHead + self.physicsBody?.contactTestBitMask = CollisionCategories.EdgeBody | CollisionCategories.Apple | CollisionCategories.Snake + + } + + + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/LessonSnake/LessonSnakeTests/Info.plist b/LessonSnake/LessonSnakeTests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/LessonSnake/LessonSnakeTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/LessonSnake/LessonSnakeTests/LessonSnakeTests.swift b/LessonSnake/LessonSnakeTests/LessonSnakeTests.swift new file mode 100644 index 0000000..0520430 --- /dev/null +++ b/LessonSnake/LessonSnakeTests/LessonSnakeTests.swift @@ -0,0 +1,34 @@ +// +// LessonSnakeTests.swift +// LessonSnakeTests +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import XCTest +@testable import LessonSnake + +class LessonSnakeTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/LessonSnake/LessonSnakeUITests/Info.plist b/LessonSnake/LessonSnakeUITests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/LessonSnake/LessonSnakeUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift b/LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift new file mode 100644 index 0000000..4b4c503 --- /dev/null +++ b/LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift @@ -0,0 +1,43 @@ +// +// LessonSnakeUITests.swift +// LessonSnakeUITests +// +// Created by Konstantin on 09.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import XCTest + +class LessonSnakeUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { + XCUIApplication().launch() + } + } + } +} From 6c2c8b645347278b6074b9a4f52deb502c6a28eb Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sun, 21 Jun 2020 18:00:37 +0300 Subject: [PATCH 7/7] Modif --- .DS_Store | Bin 6148 -> 6148 bytes LessonSnake/.DS_Store | Bin 6148 -> 0 bytes .../LessonSnake.xcodeproj/project.pbxproj | 613 ------------------ .../UserInterfaceState.xcuserstate | Bin 39077 -> 0 bytes LessonSnake/LessonSnake/Actions.sks | Bin 1892 -> 0 bytes LessonSnake/LessonSnake/AppDelegate.swift | 41 -- .../LessonSnake/Base.lproj/Main.storyboard | 24 - LessonSnake/LessonSnake/GameScene.sks | Bin 4694 -> 0 bytes LessonSnake/LessonSnake/GameScene.swift | 155 ----- .../LessonSnake/GameViewController.swift | 46 -- LessonSnake/LessonSnake/Node/Apple.swift | 33 - LessonSnake/LessonSnake/Node/Snake.swift | 80 --- .../LessonSnake/Node/SnakeBodyPart.swift | 39 -- LessonSnake/LessonSnake/Node/SnakeHead.swift | 26 - LessonSnake/LessonSnakeTests/Info.plist | 22 - .../LessonSnakeTests/LessonSnakeTests.swift | 34 - LessonSnake/LessonSnakeUITests/Info.plist | 22 - .../LessonSnakeUITests.swift | 43 -- Weather/Weather.xcodeproj/project.pbxproj | 359 ++++++++++ .../contents.xcworkspacedata | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 44120 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 24 + .../xcschemes/xcschememanagement.plist | 2 +- Weather/Weather/AllCitiesCell.swift | 15 + .../AllCitiesTableViewController.swift | 42 ++ Weather/Weather/AppDelegate.swift | 20 + .../AppIcon.appiconset/Contents.json | 0 .../Weather}/Assets.xcassets/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 Weather/Weather/Base.lproj/Main.storyboard | 287 ++++++++ .../Weather}/Info.plist | 2 - Weather/Weather/LoginViewController.swift | 85 +++ .../Weather/MyCitiesTableViewController.swift | 58 ++ Weather/Weather/WeatherCell.swift | 13 + .../WeatherCollectionViewController.swift | 38 ++ 36 files changed, 943 insertions(+), 1182 deletions(-) delete mode 100644 LessonSnake/.DS_Store delete mode 100644 LessonSnake/LessonSnake.xcodeproj/project.pbxproj delete mode 100644 LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcuserdata/konstantin.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 LessonSnake/LessonSnake/Actions.sks delete mode 100644 LessonSnake/LessonSnake/AppDelegate.swift delete mode 100644 LessonSnake/LessonSnake/Base.lproj/Main.storyboard delete mode 100644 LessonSnake/LessonSnake/GameScene.sks delete mode 100644 LessonSnake/LessonSnake/GameScene.swift delete mode 100644 LessonSnake/LessonSnake/GameViewController.swift delete mode 100644 LessonSnake/LessonSnake/Node/Apple.swift delete mode 100644 LessonSnake/LessonSnake/Node/Snake.swift delete mode 100644 LessonSnake/LessonSnake/Node/SnakeBodyPart.swift delete mode 100644 LessonSnake/LessonSnake/Node/SnakeHead.swift delete mode 100644 LessonSnake/LessonSnakeTests/Info.plist delete mode 100644 LessonSnake/LessonSnakeTests/LessonSnakeTests.swift delete mode 100644 LessonSnake/LessonSnakeUITests/Info.plist delete mode 100644 LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift create mode 100644 Weather/Weather.xcodeproj/project.pbxproj rename {LessonSnake/LessonSnake.xcodeproj => Weather/Weather.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (69%) rename {LessonSnake/LessonSnake.xcodeproj => Weather/Weather.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 Weather/Weather.xcodeproj/project.xcworkspace/xcuserdata/konstantin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Weather/Weather.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist rename {LessonSnake/LessonSnake.xcodeproj => Weather/Weather.xcodeproj}/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist (86%) create mode 100644 Weather/Weather/AllCitiesCell.swift create mode 100644 Weather/Weather/AllCitiesTableViewController.swift create mode 100644 Weather/Weather/AppDelegate.swift rename {LessonSnake/LessonSnake => Weather/Weather}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {LessonSnake/LessonSnake => Weather/Weather}/Assets.xcassets/Contents.json (100%) rename {LessonSnake/LessonSnake => Weather/Weather}/Base.lproj/LaunchScreen.storyboard (100%) create mode 100644 Weather/Weather/Base.lproj/Main.storyboard rename {LessonSnake/LessonSnake => Weather/Weather}/Info.plist (97%) create mode 100644 Weather/Weather/LoginViewController.swift create mode 100644 Weather/Weather/MyCitiesTableViewController.swift create mode 100644 Weather/Weather/WeatherCell.swift create mode 100644 Weather/Weather/WeatherCollectionViewController.swift diff --git a/.DS_Store b/.DS_Store index 14bec380fbb9af09de021cac8c451e2ca0d5bc0b..0bae43a068bde26302a57f9c92ea25e154536938 100644 GIT binary patch delta 99 zcmZoMXffDunPsvZTN*z*LpVb!Ln1>7Lk5s8n*54I9z#rlbt0RAj)IAy<>c+Gj?!pa a%7TmXa`N-i85kHCHx|xg+|17LmmdJu1{qBN delta 123 zcmZoMXffDunMItN!G|H0p%@7B8S)r{fjE&Nn;~_w2dg|zxiZ#?Y^FL2#^$DzdD$G5 gaTrk+T$GoSpO?>Pjj0nxA>;s5{u diff --git a/LessonSnake/.DS_Store b/LessonSnake/.DS_Store deleted file mode 100644 index 4efdfa150bb0c29e096ade0c16d4a0a70ed1666d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!EVz)5S?uU-K0WT2-F_;g2W+0snU`ILb5_RMB;$t0tY~?U0c-PdZXBBfDq&h z9|3>Br|<=Q4$SNhs7Y!e4j@|XM6+*pci!558}E7nK=jA)7Jvr;5}mNo!r~00e)1(- z;TGx?W(*BE1n42WUdnb2P64OD|E2)FyX)`}5-9L@`u$A?nLdm%9bpD74|maTeK&?t zEi0N7LuP%AhFMyaoz6G0vf8+Gc}>ceY+Y%+2#)k5D8q7G^uy6JsyzzJqln`@t+QWo z7(Gdo$-Z~}zRt@q&6ANKr*VQQ&!47wtS5av&f~(26W9(Zo3gp@ZBD1%?VYyj_I74% zHSP5}ZMEIKGn+N##?7sJgM;I@@22l(A3m7}0)dN|v8#+f;WGv`BAo=IJk$A0%pmrS zv!#UF@CFW1-WY`*!U&^R3-W$J_Gx*&nvwR*RFzQ7^To!W@-ON{{Z_bzDZ5r9^kW!6 zo!B22#K!75H2%BG^>cXd?v|YbPJzFx0Id%SozQ2jESjYQ3v&cOY+$o7jOk;6IEv9{ ztSn*=ny^$vOBH;?5SEVZit~KN%A%!%;KPUDD+@lM2y=BDUzv0ezC~9$1)Ku&3ar|y zNBjSS`t$!h$<>?!PJs)hfN1OnyM25l-dmR*j`muGet=F!d6h*&!GgDA6VO(?iEa%0 Y6a|PrV`ULr(AS6-PB#>PJLbCQLMyHP}2UG<#*K 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 O-Ncq>_wTo8$NvCZZiBG^ diff --git a/LessonSnake/LessonSnake/Actions.sks b/LessonSnake/LessonSnake/Actions.sks deleted file mode 100644 index 053052001e4f4fd4d597c1c74f1ab1919ec27642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1892 zcmZ`)Yj6`)6uz&eFQ92@dGy_G5(=enKp96$L5ff*(6lru;IeI&c1yYm*-fOibnb+L ziXbnkh*;Vbc~r*AOL@vLhztS(Eh-2K3jT3q#^DDlI*vCFpjFt+-Fx=z-gC}(zVF^t zIc&13<>Xv}2or9=_dl5RZpo?2cEzl>SJg??nrhLD&gxp3xy$sL-4PAo%Jy#ExRB7O z=;0$qjm{X8nUz1WVA9l@TDfkqtzNM^URk~7t+ngczrESpxqbJc!$*#v{qo#bm#=+y z{YJT7aoKFWVc`)22kRh)+mNN=`{lyd%r-RrS+&|N#FSadQUV85ii(Z)Lojir=Xgp25sf#I^mi%JG^u!s( zDK90>ESWVseojKEiRVofW{c67zTjnHp|OhRCDS|~Hp#}|yCp#v&7R6cXN{zpHl6qjc~w zO^^60c+l0=&Y0pK8ex^M=H}##Nny8TJxiRbRvFNpBGyahfGMdJrec2&I#rk3Y$`7F z3(;I+n&saXPvL;~aj>kJao}0*@fbZkzslsVHh?CDCI!(X(?pugej#l5uqHea4dM%e z66;^_hK+3V6gr(^gLi|QA=uPf$*Pr>xFn@o>U_uL?(_Iqi|;ZmzHivZr&D84a(X5? z1Iyk=+z&g+B=nU9kANsdi(Vlc;w};)px&M>h$e%Kt=8c|UIN$CZ z!@_0y!zDj4-1!TP&S_4&%h7q>Ck6S(A!oZEoOf^keleoobaeyEEu6&wVy4H$NJL0wCxjOH9R5gJdlX z9-cinZ~gdFxgaZx>}5{7U86Y^vM-}R96L}lK^}Mp*ntZ)ffle9w1UlG3)l+UKs(q4 zy1`zs9~=aqg2UhhxCE|&+u$zv6A~B+<6$C9hN+N;1~?Lqf*Eiud>$6TX>d9$fpee< zmct5I2baSY@HO}bd=svLYvFph5pIHQa3|aYyWw8AA0C9a;I9ax5Htj(pbRtx%|SA9 zqZYIdwW7^v3)+g>P&@LX?Pv$ug}Trl^bz_P?L!C9C+HA5f{vlj&>3_I^`PtM4!Vo( zqu(*YAvhYxV;+yhId}rL;zhU?*I^r0umd}>hTV86Zp2Nv8B^@REqEn<9k0Tx@h04c z+wpFE03XID@#pv~zJjmf+xR~I13$oj<9`Ssh!8S>gpw!{N0Lbz(Gw#{Ck12%5s5+^ z#7Q*bCQC^pX(G*p5)Wx1Ye*}3k9f%ra-5tXC&?*tnw%kL$vJX?TqKuCFS$W}Cclt- zP%{{=8& BT4?|P diff --git a/LessonSnake/LessonSnake/AppDelegate.swift b/LessonSnake/LessonSnake/AppDelegate.swift deleted file mode 100644 index 93a499d..0000000 --- a/LessonSnake/LessonSnake/AppDelegate.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// AppDelegate.swift -// LessonSnake -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> 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. - } - - 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. - } - - -} - diff --git a/LessonSnake/LessonSnake/Base.lproj/Main.storyboard b/LessonSnake/LessonSnake/Base.lproj/Main.storyboard deleted file mode 100644 index 2cc971a..0000000 --- a/LessonSnake/LessonSnake/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LessonSnake/LessonSnake/GameScene.sks b/LessonSnake/LessonSnake/GameScene.sks deleted file mode 100644 index 4fe4d9f41e763cb136277f8a00e3f7ce3ea3daa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4694 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 diff --git a/LessonSnake/LessonSnake/GameScene.swift b/LessonSnake/LessonSnake/GameScene.swift deleted file mode 100644 index a86f487..0000000 --- a/LessonSnake/LessonSnake/GameScene.swift +++ /dev/null @@ -1,155 +0,0 @@ -// -// GameScene.swift -// LessonSnake -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import SpriteKit -import GameplayKit - -struct CollisionCategories { - static let Snake: UInt32 = 0x1 << 0 - static let SnekeHead: UInt32 = 0x1 << 1 - static let Apple: UInt32 = 0x1 << 2 - static let EdgeBody: UInt32 = 0x1 << 3 -} - -class GameScene: SKScene { - - var snake: Snake? - - - override func didMove(to view: SKView) { - - backgroundColor = SKColor.black - self.physicsWorld.gravity = CGVector(dx: 0, dy: 0) - self.physicsBody = SKPhysicsBody(edgeLoopFrom: frame) - self.physicsBody?.allowsRotation = false - view.showsPhysics = true - - self.physicsWorld.contactDelegate = self - - - let counterClockwiseButton = SKShapeNode() - - counterClockwiseButton.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 45, height: 45)).cgPath - - counterClockwiseButton.position = CGPoint(x: view.scene!.frame.minX+30, y: view.scene!.frame.minY+30) - - counterClockwiseButton.fillColor = UIColor.gray - - counterClockwiseButton.strokeColor = UIColor.gray - counterClockwiseButton.lineWidth = 10 - - counterClockwiseButton.name = "counterClockwiseButton" - - self.addChild(counterClockwiseButton) - - let clockwiseButton = SKShapeNode() - clockwiseButton.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 45, height: 45)).cgPath - clockwiseButton.position = CGPoint(x: view.scene!.frame.maxX - 80, y: view.scene!.frame.minY + 30) - clockwiseButton.fillColor = UIColor.gray - clockwiseButton.strokeColor = UIColor.gray - - clockwiseButton.lineWidth = 10 - - clockwiseButton.name = "clockwiseButton" - self.addChild(clockwiseButton) - - createApple() - - snake = Snake(atPoint: CGPoint(x: view.scene!.frame.midX, y: view.scene!.frame.midY)) - - self.addChild(snake!) - - self.physicsBody?.categoryBitMask = CollisionCategories.EdgeBody - self.physicsBody?.collisionBitMask = CollisionCategories.Snake | CollisionCategories.SnekeHead - - } - - func createApple() { - let randX = CGFloat(arc4random_uniform(UInt32(view!.scene!.frame.maxX-25))) - - let randY = CGFloat(arc4random_uniform(UInt32(view!.scene!.frame.maxY-25))) - - let apple = Apple(position: CGPoint(x: randX, y: randY)) - self.addChild(apple) - - } - - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - - for touch in touches { - - let touchLocation = touch.location(in: self) - - guard let touchNode = self.atPoint(touchLocation) as? SKShapeNode, touchNode.name == "counterClockwiseButton" || touchNode.name == "clockwiseButton" else { - return - } - - touchNode.fillColor = .green - - } - - } - - - override func touchesEnded(_ touches: Set, with event: UIEvent?) { - - for touch in touches { - - let touchLocation = touch.location(in: self) - - guard let touchNode = self.atPoint(touchLocation) as? SKShapeNode, touchNode.name == "counterClockwiseButton" || touchNode.name == "clockwiseButton" else { - return - } - - touchNode.fillColor = .gray - - if touchNode.name == "counterClockwiseButton" { - snake!.moveCounterClockwise() - } else if touchNode.name == "clockwiseButton" { - snake!.moveClockwise() - } - - } - - } - - override func touchesCancelled(_ touches: Set, with event: UIEvent?) { - - } - - - override func update(_ currentTime: TimeInterval) { - snake!.move() - } -} - - -extension GameScene: SKPhysicsContactDelegate { - func didBegin(_ contact: SKPhysicsContact) { - - let bodyes = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask - let collisionObject = bodyes ^ CollisionCategories.SnekeHead - - switch collisionObject { - case CollisionCategories.Apple: - let apple = contact.bodyA.node is Apple ? contact.bodyA.node : contact.bodyB.node - snake?.addBodyPart() - apple?.removeFromParent() - createApple() - case CollisionCategories.EdgeBody: - let _ = contact.bodyA.node is GameScene ? contact.bodyA.node : contact.bodyB.node - let gameScene = GameScene(size: self.size) - self.view?.presentScene(gameScene) - default: - break - } - - - } -} diff --git a/LessonSnake/LessonSnake/GameViewController.swift b/LessonSnake/LessonSnake/GameViewController.swift deleted file mode 100644 index 28e5643..0000000 --- a/LessonSnake/LessonSnake/GameViewController.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// GameViewController.swift -// LessonSnake -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import UIKit -import SpriteKit -import GameplayKit - -class GameViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - let scene = GameScene(size: view.bounds.size) - - let skView = view as! SKView - - skView.showsFPS = true - skView.showsNodeCount = true - skView.ignoresSiblingOrder = true - - scene.scaleMode = .resizeFill - skView.presentScene(scene) - - } - - override var shouldAutorotate: Bool { - return true - } - - override var supportedInterfaceOrientations: UIInterfaceOrientationMask { - if UIDevice.current.userInterfaceIdiom == .phone { - return .allButUpsideDown - } else { - return .all - } - } - - override var prefersStatusBarHidden: Bool { - return true - } -} diff --git a/LessonSnake/LessonSnake/Node/Apple.swift b/LessonSnake/LessonSnake/Node/Apple.swift deleted file mode 100644 index fa689fd..0000000 --- a/LessonSnake/LessonSnake/Node/Apple.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// Apple.swift -// LessonSnake -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import UIKit -import SpriteKit - -class Apple: SKShapeNode { - - convenience init(position: CGPoint) { - self.init() - - path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 10, height: 10)).cgPath - - fillColor = UIColor.red - strokeColor = UIColor.red - - lineWidth = 5 - - self.position = position - - self.physicsBody = SKPhysicsBody(circleOfRadius: 10, center: CGPoint(x: 5, y: 5)) - - self.physicsBody?.categoryBitMask = CollisionCategories.Apple - - - } - -} diff --git a/LessonSnake/LessonSnake/Node/Snake.swift b/LessonSnake/LessonSnake/Node/Snake.swift deleted file mode 100644 index 1557ee4..0000000 --- a/LessonSnake/LessonSnake/Node/Snake.swift +++ /dev/null @@ -1,80 +0,0 @@ -// -// Snake.swift -// LessonSnake -// -// Created by Konstantin on 10.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import UIKit -import SpriteKit - -class Snake: SKShapeNode { - - let moveSpeed = 125.0 - var angle: CGFloat = 0.0 - - var body = [SnakeBodyPart]() - - convenience init(atPoint point: CGPoint) { - self.init() - - - - let head = SnakeHead(atPoint: point) - body.append(head) - addChild(head) - - } - - func move() { - - guard !body.isEmpty else {return} - - let head = body[0] - moveHead(head) - - for index in (0.. 0 { - let previousBodyPart = body[index-1] - let currentBodyPart = body[index] - moveBodyPart(previousBodyPart, c: currentBodyPart) - } - - } - - func moveHead(_ head: SnakeBodyPart) { - - let dx = CGFloat(moveSpeed) * sin(angle) - let dy = CGFloat(moveSpeed) * cos(angle) - - let nextPosition = CGPoint(x: head.position.x+dx, y: head.position.y+dy) - - let moveAction = SKAction.move(to: nextPosition, duration: 1.0) - head.run(moveAction) - - } - - func moveBodyPart(_ p: SnakeBodyPart, c: SnakeBodyPart) { - - let moveACtion = SKAction.move(to: CGPoint(x: p.position.x, y: p.position.y), duration: 0.1) - c.run(moveACtion) - - } - - func addBodyPart() { - let newBodyPart = SnakeBodyPart(atPoint: CGPoint(x: body[0].position.x, y: body[0].position.y)) - - body.append(newBodyPart) - addChild(newBodyPart) - } - - func moveClockwise() { - angle += CGFloat(Double.pi/2) - } - - func moveCounterClockwise() { - angle -= CGFloat(Double.pi/2) - } - - -} diff --git a/LessonSnake/LessonSnake/Node/SnakeBodyPart.swift b/LessonSnake/LessonSnake/Node/SnakeBodyPart.swift deleted file mode 100644 index 7bdb037..0000000 --- a/LessonSnake/LessonSnake/Node/SnakeBodyPart.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// SnakeBodyPart.swift -// LessonSnake -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import UIKit -import SpriteKit - -class SnakeBodyPart: SKShapeNode { - - let diametr = 10.0 - - init(atPoint point: CGPoint) { - super.init() - - path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: diametr, height: diametr)).cgPath - - fillColor = UIColor.green - strokeColor = UIColor.green - lineWidth = 5 - - self.position = point - - self.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(diametr - 4), center: CGPoint(x: 5, y: 5)) - self.physicsBody?.isDynamic = true - self.physicsBody?.categoryBitMask = CollisionCategories.Snake - - self.physicsBody?.categoryBitMask = CollisionCategories.EdgeBody | CollisionCategories.Apple - - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} diff --git a/LessonSnake/LessonSnake/Node/SnakeHead.swift b/LessonSnake/LessonSnake/Node/SnakeHead.swift deleted file mode 100644 index ade1668..0000000 --- a/LessonSnake/LessonSnake/Node/SnakeHead.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// SnakeHead.swift -// LessonSnake -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import UIKit - - -class SnakeHead: SnakeBodyPart { - override init(atPoint point: CGPoint) { - super.init(atPoint: point) - - self.physicsBody?.categoryBitMask = CollisionCategories.SnekeHead - self.physicsBody?.contactTestBitMask = CollisionCategories.EdgeBody | CollisionCategories.Apple | CollisionCategories.Snake - - } - - - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/LessonSnake/LessonSnakeTests/Info.plist b/LessonSnake/LessonSnakeTests/Info.plist deleted file mode 100644 index 64d65ca..0000000 --- a/LessonSnake/LessonSnakeTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/LessonSnake/LessonSnakeTests/LessonSnakeTests.swift b/LessonSnake/LessonSnakeTests/LessonSnakeTests.swift deleted file mode 100644 index 0520430..0000000 --- a/LessonSnake/LessonSnakeTests/LessonSnakeTests.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// LessonSnakeTests.swift -// LessonSnakeTests -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import XCTest -@testable import LessonSnake - -class LessonSnakeTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() throws { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/LessonSnake/LessonSnakeUITests/Info.plist b/LessonSnake/LessonSnakeUITests/Info.plist deleted file mode 100644 index 64d65ca..0000000 --- a/LessonSnake/LessonSnakeUITests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift b/LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift deleted file mode 100644 index 4b4c503..0000000 --- a/LessonSnake/LessonSnakeUITests/LessonSnakeUITests.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// LessonSnakeUITests.swift -// LessonSnakeUITests -// -// Created by Konstantin on 09.06.2020. -// Copyright © 2020 Konstantin. All rights reserved. -// - -import XCTest - -class LessonSnakeUITests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // UI tests must launch the application that they test. - let app = XCUIApplication() - app.launch() - - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testLaunchPerformance() throws { - if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { - // This measures how long it takes to launch your application. - measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { - XCUIApplication().launch() - } - } - } -} diff --git a/Weather/Weather.xcodeproj/project.pbxproj b/Weather/Weather.xcodeproj/project.pbxproj new file mode 100644 index 0000000..19db2a6 --- /dev/null +++ b/Weather/Weather.xcodeproj/project.pbxproj @@ -0,0 +1,359 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + B5788752249F8FF600D1AE9F /* AllCitiesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5788751249F8FF600D1AE9F /* AllCitiesTableViewController.swift */; }; + B5788754249F90D100D1AE9F /* AllCitiesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5788753249F90D100D1AE9F /* AllCitiesCell.swift */; }; + B5788756249F93A100D1AE9F /* MyCitiesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5788755249F93A100D1AE9F /* MyCitiesTableViewController.swift */; }; + B5788758249FA4D300D1AE9F /* WeatherCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5788757249FA4D300D1AE9F /* WeatherCollectionViewController.swift */; }; + B578875A249FA5D700D1AE9F /* WeatherCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5788759249FA5D700D1AE9F /* WeatherCell.swift */; }; + B59D61CB2497F55E00E3411A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59D61CA2497F55E00E3411A /* AppDelegate.swift */; }; + B59D61CF2497F55E00E3411A /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59D61CE2497F55E00E3411A /* LoginViewController.swift */; }; + B59D61D22497F55E00E3411A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B59D61D02497F55E00E3411A /* Main.storyboard */; }; + B59D61D42497F56100E3411A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B59D61D32497F56100E3411A /* Assets.xcassets */; }; + B59D61D72497F56100E3411A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B59D61D52497F56100E3411A /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + B5788751249F8FF600D1AE9F /* AllCitiesTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllCitiesTableViewController.swift; sourceTree = ""; }; + B5788753249F90D100D1AE9F /* AllCitiesCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllCitiesCell.swift; sourceTree = ""; }; + B5788755249F93A100D1AE9F /* MyCitiesTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCitiesTableViewController.swift; sourceTree = ""; }; + B5788757249FA4D300D1AE9F /* WeatherCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherCollectionViewController.swift; sourceTree = ""; }; + B5788759249FA5D700D1AE9F /* WeatherCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherCell.swift; sourceTree = ""; }; + B59D61C72497F55E00E3411A /* Weather.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Weather.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B59D61CA2497F55E00E3411A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + B59D61CE2497F55E00E3411A /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + B59D61D12497F55E00E3411A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + B59D61D32497F56100E3411A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + B59D61D62497F56100E3411A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + B59D61D82497F56100E3411A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B59D61C42497F55E00E3411A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + B59D61BE2497F55E00E3411A = { + isa = PBXGroup; + children = ( + B59D61C92497F55E00E3411A /* Weather */, + B59D61C82497F55E00E3411A /* Products */, + ); + sourceTree = ""; + }; + B59D61C82497F55E00E3411A /* Products */ = { + isa = PBXGroup; + children = ( + B59D61C72497F55E00E3411A /* Weather.app */, + ); + name = Products; + sourceTree = ""; + }; + B59D61C92497F55E00E3411A /* Weather */ = { + isa = PBXGroup; + children = ( + B59D61CA2497F55E00E3411A /* AppDelegate.swift */, + B59D61CE2497F55E00E3411A /* LoginViewController.swift */, + B5788751249F8FF600D1AE9F /* AllCitiesTableViewController.swift */, + B5788753249F90D100D1AE9F /* AllCitiesCell.swift */, + B5788755249F93A100D1AE9F /* MyCitiesTableViewController.swift */, + B5788757249FA4D300D1AE9F /* WeatherCollectionViewController.swift */, + B5788759249FA5D700D1AE9F /* WeatherCell.swift */, + B59D61D02497F55E00E3411A /* Main.storyboard */, + B59D61D32497F56100E3411A /* Assets.xcassets */, + B59D61D52497F56100E3411A /* LaunchScreen.storyboard */, + B59D61D82497F56100E3411A /* Info.plist */, + ); + path = Weather; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B59D61C62497F55E00E3411A /* Weather */ = { + isa = PBXNativeTarget; + buildConfigurationList = B59D61DB2497F56100E3411A /* Build configuration list for PBXNativeTarget "Weather" */; + buildPhases = ( + B59D61C32497F55E00E3411A /* Sources */, + B59D61C42497F55E00E3411A /* Frameworks */, + B59D61C52497F55E00E3411A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Weather; + productName = Weather; + productReference = B59D61C72497F55E00E3411A /* Weather.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + B59D61BF2497F55E00E3411A /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1150; + LastUpgradeCheck = 1150; + ORGANIZATIONNAME = Konstantin; + TargetAttributes = { + B59D61C62497F55E00E3411A = { + CreatedOnToolsVersion = 11.5; + }; + }; + }; + buildConfigurationList = B59D61C22497F55E00E3411A /* Build configuration list for PBXProject "Weather" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = B59D61BE2497F55E00E3411A; + productRefGroup = B59D61C82497F55E00E3411A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B59D61C62497F55E00E3411A /* Weather */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B59D61C52497F55E00E3411A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B59D61D72497F56100E3411A /* LaunchScreen.storyboard in Resources */, + B59D61D42497F56100E3411A /* Assets.xcassets in Resources */, + B59D61D22497F55E00E3411A /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B59D61C32497F55E00E3411A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B5788756249F93A100D1AE9F /* MyCitiesTableViewController.swift in Sources */, + B5788754249F90D100D1AE9F /* AllCitiesCell.swift in Sources */, + B59D61CF2497F55E00E3411A /* LoginViewController.swift in Sources */, + B5788758249FA4D300D1AE9F /* WeatherCollectionViewController.swift in Sources */, + B59D61CB2497F55E00E3411A /* AppDelegate.swift in Sources */, + B5788752249F8FF600D1AE9F /* AllCitiesTableViewController.swift in Sources */, + B578875A249FA5D700D1AE9F /* WeatherCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + B59D61D02497F55E00E3411A /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B59D61D12497F55E00E3411A /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + B59D61D52497F56100E3411A /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B59D61D62497F56100E3411A /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + B59D61D92497F56100E3411A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + B59D61DA2497F56100E3411A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + B59D61DC2497F56100E3411A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = RQYPG8XK25; + INFOPLIST_FILE = Weather/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.ckost9n.Weather; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B59D61DD2497F56100E3411A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = RQYPG8XK25; + INFOPLIST_FILE = Weather/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.ckost9n.Weather; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + B59D61C22497F55E00E3411A /* Build configuration list for PBXProject "Weather" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B59D61D92497F56100E3411A /* Debug */, + B59D61DA2497F56100E3411A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B59D61DB2497F56100E3411A /* Build configuration list for PBXNativeTarget "Weather" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B59D61DC2497F56100E3411A /* Debug */, + B59D61DD2497F56100E3411A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = B59D61BF2497F55E00E3411A /* Project object */; +} diff --git a/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Weather/Weather.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 69% rename from LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Weather/Weather.xcodeproj/project.xcworkspace/contents.xcworkspacedata index bb6aabe..561f654 100644 --- a/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Weather/Weather.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:Weather.xcodeproj"> diff --git a/LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Weather/Weather.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from LessonSnake/LessonSnake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Weather/Weather.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Weather/Weather.xcodeproj/project.xcworkspace/xcuserdata/konstantin.xcuserdatad/UserInterfaceState.xcuserstate b/Weather/Weather.xcodeproj/project.xcworkspace/xcuserdata/konstantin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..3aaf5eb3d212a72a622b4196841bdc742652c164 GIT binary patch literal 44120 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 + + + + + + + + diff --git a/LessonSnake/LessonSnake.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist b/Weather/Weather.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist similarity index 86% rename from LessonSnake/LessonSnake.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist rename to Weather/Weather.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist index f940495..d1731a2 100644 --- a/LessonSnake/LessonSnake.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Weather/Weather.xcodeproj/xcuserdata/konstantin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,7 +4,7 @@ SchemeUserState - LessonSnake.xcscheme_^#shared#^_ + Weather.xcscheme_^#shared#^_ orderHint 0 diff --git a/Weather/Weather/AllCitiesCell.swift b/Weather/Weather/AllCitiesCell.swift new file mode 100644 index 0000000..f9d0811 --- /dev/null +++ b/Weather/Weather/AllCitiesCell.swift @@ -0,0 +1,15 @@ +// +// AllCitiesCell.swift +// Weather +// +// Created by Konstantin on 21.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + +class AllCitiesCell: UITableViewCell { + + @IBOutlet weak var cityLabel: UILabel! + +} diff --git a/Weather/Weather/AllCitiesTableViewController.swift b/Weather/Weather/AllCitiesTableViewController.swift new file mode 100644 index 0000000..aa2377f --- /dev/null +++ b/Weather/Weather/AllCitiesTableViewController.swift @@ -0,0 +1,42 @@ +// +// AllCitiesTableViewController.swift +// Weather +// +// Created by Konstantin on 21.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + +class AllCitiesTableViewController: UITableViewController { + + let cities: [String] = [ + "Moscow", + "London", + "New-York" + ] + + override func viewDidLoad() { + super.viewDidLoad() + } + + + + // MARK: - Table view data source + + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return cities.count + } + + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! AllCitiesCell + + cell.cityLabel.text = cities[indexPath.row] + + return cell + } + + +} diff --git a/Weather/Weather/AppDelegate.swift b/Weather/Weather/AppDelegate.swift new file mode 100644 index 0000000..7d045ae --- /dev/null +++ b/Weather/Weather/AppDelegate.swift @@ -0,0 +1,20 @@ +// +// AppDelegate.swift +// Weather +// +// Created by Konstantin on 15.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + return true + } +} + diff --git a/LessonSnake/LessonSnake/Assets.xcassets/AppIcon.appiconset/Contents.json b/Weather/Weather/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from LessonSnake/LessonSnake/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Weather/Weather/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/LessonSnake/LessonSnake/Assets.xcassets/Contents.json b/Weather/Weather/Assets.xcassets/Contents.json similarity index 100% rename from LessonSnake/LessonSnake/Assets.xcassets/Contents.json rename to Weather/Weather/Assets.xcassets/Contents.json diff --git a/LessonSnake/LessonSnake/Base.lproj/LaunchScreen.storyboard b/Weather/Weather/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from LessonSnake/LessonSnake/Base.lproj/LaunchScreen.storyboard rename to Weather/Weather/Base.lproj/LaunchScreen.storyboard diff --git a/Weather/Weather/Base.lproj/Main.storyboard b/Weather/Weather/Base.lproj/Main.storyboard new file mode 100644 index 0000000..53f9f94 --- /dev/null +++ b/Weather/Weather/Base.lproj/Main.storyboard @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LessonSnake/LessonSnake/Info.plist b/Weather/Weather/Info.plist similarity index 97% rename from LessonSnake/LessonSnake/Info.plist rename to Weather/Weather/Info.plist index 870f784..af8868b 100644 --- a/LessonSnake/LessonSnake/Info.plist +++ b/Weather/Weather/Info.plist @@ -28,8 +28,6 @@ armv7 - UIStatusBarHidden - UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Weather/Weather/LoginViewController.swift b/Weather/Weather/LoginViewController.swift new file mode 100644 index 0000000..8847807 --- /dev/null +++ b/Weather/Weather/LoginViewController.swift @@ -0,0 +1,85 @@ +// +// ViewController.swift +// Weather +// +// Created by Konstantin on 15.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + +class LoginViewController: UIViewController { + + @IBOutlet weak var scrollView: UIScrollView! + @IBOutlet weak var loginTextField: UITextField! + @IBOutlet weak var passwordTextField: UITextField! + + + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + NotificationCenter.default.addObserver( + self, + selector: #selector(keyboardWillShow), + name: UIResponder.keyboardWillShowNotification, + object: nil) + + NotificationCenter.default.addObserver( + self, + selector: #selector(keyboardWillHide), + name: UIResponder.keyboardWillHideNotification, + object: nil) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + NotificationCenter.default.removeObserver(self) + } + + @objc func keyboardWillShow(_ notification: Notification) { + guard let kbSize = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return } + + scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kbSize.height, right: 0) + } + + @objc func keyboardWillHide(_ nitification: Notification) { + scrollView.contentInset = .zero + } + + @IBAction func scrollTapped(_ gesture: UIGestureRecognizer) { + scrollView.endEditing(true) + } + + override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { + if identifier == "Home" { + let isValid = checkUserData() + if !isValid { + showErrorAlert() + } + return isValid + } + return true + } + + func checkUserData() -> Bool { + return loginTextField.text == "admin" && passwordTextField.text == "123" + } + + func showErrorAlert() { + let alert = UIAlertController( + title: "Ошибка", + message: "Неправильный логин или пароль", + preferredStyle: .alert + ) + let action = UIAlertAction(title: "OK", style: .cancel, handler: nil) + alert.addAction(action) + + present(alert, animated: true, completion: nil) + } +} + diff --git a/Weather/Weather/MyCitiesTableViewController.swift b/Weather/Weather/MyCitiesTableViewController.swift new file mode 100644 index 0000000..eeafbab --- /dev/null +++ b/Weather/Weather/MyCitiesTableViewController.swift @@ -0,0 +1,58 @@ +// +// MyCitiesTableViewController.swift +// Weather +// +// Created by Konstantin on 21.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + +class MyCitiesTableViewController: UITableViewController { + + var cities: [String] = [] + + override func viewDidLoad() { + super.viewDidLoad() + } + + @IBAction func addCity(segue: UIStoryboardSegue) { + guard + let allCitiesController = segue.source as? AllCitiesTableViewController, + let indexPath = allCitiesController.tableView.indexPathForSelectedRow + else { return } + + let city = allCitiesController.cities[indexPath.row] + + guard !cities.contains(city) else { return } + + cities.append(city) + tableView.reloadData() + } + + + // MARK: - Table view data source + + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return cities.count + } + + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) + + cell.textLabel?.text = cities[indexPath.row] + + return cell + } + + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + cities.remove(at: indexPath.row) + tableView.deleteRows(at: [indexPath], with: .fade) + } + } + + +} diff --git a/Weather/Weather/WeatherCell.swift b/Weather/Weather/WeatherCell.swift new file mode 100644 index 0000000..c3cb3bd --- /dev/null +++ b/Weather/Weather/WeatherCell.swift @@ -0,0 +1,13 @@ +// +// WeatherCell.swift +// Weather +// +// Created by Konstantin on 21.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + +class WeatherCell: UICollectionViewCell { + +} diff --git a/Weather/Weather/WeatherCollectionViewController.swift b/Weather/Weather/WeatherCollectionViewController.swift new file mode 100644 index 0000000..cde46df --- /dev/null +++ b/Weather/Weather/WeatherCollectionViewController.swift @@ -0,0 +1,38 @@ +// +// WeatherCollectionViewController.swift +// Weather +// +// Created by Konstantin on 21.06.2020. +// Copyright © 2020 Konstantin. All rights reserved. +// + +import UIKit + + +class WeatherCollectionViewController: UICollectionViewController { + + + + override func viewDidLoad() { + super.viewDidLoad() + + } + + + + // MARK: UICollectionViewDataSource + + + override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 20 + } + + override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! WeatherCell + + + + return cell + } + +}