From 133daa04879c63e9afb331358be67663166930b3 Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Fri, 18 Feb 2022 12:33:23 +0300 Subject: [PATCH 01/11] refactor --- MagicBall.xcodeproj/project.pbxproj | 12 ++++++--- .../Controllers/HomeViewController.swift | 15 +++-------- .../Controllers/SettingsViewController.swift | 8 +++--- MagicBall/Model/Answer.swift | 26 +++++++++++++++++++ MagicBall/Model/Answers.swift | 13 ---------- MagicBall/Model/DemoData.swift | 12 +++++++++ MagicBall/Model/Network/NetworkManager.swift | 3 ++- MagicBall/Views/Base.lproj/Main.storyboard | 15 +++++------ 8 files changed, 63 insertions(+), 41 deletions(-) create mode 100644 MagicBall/Model/Answer.swift delete mode 100644 MagicBall/Model/Answers.swift create mode 100644 MagicBall/Model/DemoData.swift diff --git a/MagicBall.xcodeproj/project.pbxproj b/MagicBall.xcodeproj/project.pbxproj index b4b3990..f0b23af 100644 --- a/MagicBall.xcodeproj/project.pbxproj +++ b/MagicBall.xcodeproj/project.pbxproj @@ -15,9 +15,10 @@ 5E4D3FE62790867600A0861A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E4D3FE52790867600A0861A /* Assets.xcassets */; }; 5E4D3FE92790867600A0861A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E4D3FE72790867600A0861A /* LaunchScreen.storyboard */; }; 5E4D3FF12790BC8000A0861A /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF02790BC7F00A0861A /* SettingsViewController.swift */; }; - 5E4D3FF427916B6C00A0861A /* Answers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF327916B6C00A0861A /* Answers.swift */; }; + 5E4D3FF427916B6C00A0861A /* Answer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF327916B6C00A0861A /* Answer.swift */; }; 5E4D3FF92791AC8500A0861A /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF82791AC8500A0861A /* NetworkManager.swift */; }; 5E4D3FFC2792E1DD00A0861A /* MagicBallAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FFB2792E1DD00A0861A /* MagicBallAPI.swift */; }; + 5EEF756B27BF9042007A1C99 /* DemoData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EEF756A27BF9042007A1C99 /* DemoData.swift */; }; 5EF855FE2794319800A9DE67 /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = 5EF855FD2794319800A9DE67 /* .gitignore */; }; 5EF8560427943B3200A9DE67 /* 002.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5EF8560227943B3200A9DE67 /* 002.jpg */; }; 5EF8560527943B3200A9DE67 /* 001.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5EF8560327943B3200A9DE67 /* 001.jpg */; }; @@ -34,9 +35,10 @@ 5E4D3FE82790867600A0861A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 5E4D3FEA2790867600A0861A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5E4D3FF02790BC7F00A0861A /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; - 5E4D3FF327916B6C00A0861A /* Answers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Answers.swift; sourceTree = ""; }; + 5E4D3FF327916B6C00A0861A /* Answer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Answer.swift; sourceTree = ""; }; 5E4D3FF82791AC8500A0861A /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = ""; }; 5E4D3FFB2792E1DD00A0861A /* MagicBallAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicBallAPI.swift; sourceTree = ""; }; + 5EEF756A27BF9042007A1C99 /* DemoData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoData.swift; sourceTree = ""; }; 5EF855FD2794319800A9DE67 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; 5EF8560227943B3200A9DE67 /* 002.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 002.jpg; sourceTree = ""; }; 5EF8560327943B3200A9DE67 /* 001.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 001.jpg; sourceTree = ""; }; @@ -89,7 +91,8 @@ isa = PBXGroup; children = ( 5E4D3FF72791AC5A00A0861A /* Network */, - 5E4D3FF327916B6C00A0861A /* Answers.swift */, + 5E4D3FF327916B6C00A0861A /* Answer.swift */, + 5EEF756A27BF9042007A1C99 /* DemoData.swift */, ); path = Model; sourceTree = ""; @@ -222,12 +225,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5EEF756B27BF9042007A1C99 /* DemoData.swift in Sources */, 5E4D3FF92791AC8500A0861A /* NetworkManager.swift in Sources */, 5E4D3FE12790867400A0861A /* HomeViewController.swift in Sources */, 5E4D3FDD2790867400A0861A /* AppDelegate.swift in Sources */, 5E4D3FDF2790867400A0861A /* SceneDelegate.swift in Sources */, 5E4D3FFC2792E1DD00A0861A /* MagicBallAPI.swift in Sources */, - 5E4D3FF427916B6C00A0861A /* Answers.swift in Sources */, + 5E4D3FF427916B6C00A0861A /* Answer.swift in Sources */, 5E4D3FF12790BC8000A0861A /* SettingsViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/MagicBall/Controllers/HomeViewController.swift b/MagicBall/Controllers/HomeViewController.swift index 9034aab..9bc552b 100644 --- a/MagicBall/Controllers/HomeViewController.swift +++ b/MagicBall/Controllers/HomeViewController.swift @@ -9,27 +9,20 @@ import UIKit class HomeViewController: UIViewController { - @IBOutlet weak var answer: UILabel! + @IBOutlet weak var answerLabel: UILabel! - private let networkManager = NetworkManager() + private let answer = Answer() override func viewDidLoad() { super.viewDidLoad() self.becomeFirstResponder() - answer.text = "Shake me!" + answerLabel.text = "Shake me!" } // MARK: - Shake motion override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { if motion == .motionShake { - networkManager.postRequest { result in - switch result { - case .success(let str): - self.answer.text = str - case .failure(_): - self.answer.text = Answers.demoData[Int.random(in: 0.. Int { - return Answers.demoData.count + return DemoData.answers.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) - cell.textLabel?.text = Answers.demoData[indexPath.row] + cell.textLabel?.text = DemoData.answers[indexPath.row] cell.backgroundColor = .gray.withAlphaComponent(0.2) cell.textLabel?.textColor = .white return cell @@ -71,7 +71,7 @@ extension SettingsViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { - Answers.demoData.remove(at: indexPath.row) + DemoData.answers.remove(at: indexPath.row) self.table.deleteRows(at: [indexPath], with: .automatic) } } diff --git a/MagicBall/Model/Answer.swift b/MagicBall/Model/Answer.swift new file mode 100644 index 0000000..69cb7d8 --- /dev/null +++ b/MagicBall/Model/Answer.swift @@ -0,0 +1,26 @@ +// +// Answers.swift +// 8ball +// +// Created by Sergey Lukaschuk on 14.01.2022. +// + +import Foundation + +class Answer { + + private let networkManager = NetworkManager() + + func get() -> String { + var answer = "" + networkManager.postRequest { result in + switch result { + case .success(let str): + answer = str + case .failure(_): + answer = DemoData.answers[Int.random(in: 0.. Void ) { - guard let url = URL(string: "https://8ball.delegator.com/magic/JSON/question_string") else { return } + + guard let url = URL(string: "https://8ball.delegator.com/magic/JSON/question_string") else { fatalError() } session.dataTask(with: url) { [weak self] (data, response, error) in diff --git a/MagicBall/Views/Base.lproj/Main.storyboard b/MagicBall/Views/Base.lproj/Main.storyboard index e945fff..b81e3b7 100644 --- a/MagicBall/Views/Base.lproj/Main.storyboard +++ b/MagicBall/Views/Base.lproj/Main.storyboard @@ -1,8 +1,7 @@ - - + - + @@ -12,7 +11,7 @@ - + @@ -28,15 +27,15 @@ - + - + - + From 15390792b4f26fa98fb48c9e14b8eab93cc6d460 Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Fri, 18 Feb 2022 13:06:54 +0300 Subject: [PATCH 02/11] refactor --- MagicBall/Controllers/HomeViewController.swift | 2 +- MagicBall/Model/Answer.swift | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/MagicBall/Controllers/HomeViewController.swift b/MagicBall/Controllers/HomeViewController.swift index 9bc552b..5ac78bc 100644 --- a/MagicBall/Controllers/HomeViewController.swift +++ b/MagicBall/Controllers/HomeViewController.swift @@ -22,7 +22,7 @@ class HomeViewController: UIViewController { // MARK: - Shake motion override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { if motion == .motionShake { - answerLabel.text = answer.get() + answer.get(for: answerLabel) } } } diff --git a/MagicBall/Model/Answer.swift b/MagicBall/Model/Answer.swift index 69cb7d8..9cd28ef 100644 --- a/MagicBall/Model/Answer.swift +++ b/MagicBall/Model/Answer.swift @@ -6,21 +6,21 @@ // import Foundation +import UIKit class Answer { private let networkManager = NetworkManager() - func get() -> String { - var answer = "" + func get(for label: UILabel) { networkManager.postRequest { result in switch result { - case .success(let str): - answer = str + case .success(let answer): + label.text = answer case .failure(_): - answer = DemoData.answers[Int.random(in: 0.. Date: Fri, 18 Feb 2022 13:11:36 +0300 Subject: [PATCH 03/11] chore: new folder from files --- MagicBall.xcodeproj/project.pbxproj | 12 ++++++++++-- MagicBall/Model/{ => Answers}/Answer.swift | 0 MagicBall/Model/{ => Answers}/DemoData.swift | 0 3 files changed, 10 insertions(+), 2 deletions(-) rename MagicBall/Model/{ => Answers}/Answer.swift (100%) rename MagicBall/Model/{ => Answers}/DemoData.swift (100%) diff --git a/MagicBall.xcodeproj/project.pbxproj b/MagicBall.xcodeproj/project.pbxproj index f0b23af..28f8871 100644 --- a/MagicBall.xcodeproj/project.pbxproj +++ b/MagicBall.xcodeproj/project.pbxproj @@ -91,8 +91,7 @@ isa = PBXGroup; children = ( 5E4D3FF72791AC5A00A0861A /* Network */, - 5E4D3FF327916B6C00A0861A /* Answer.swift */, - 5EEF756A27BF9042007A1C99 /* DemoData.swift */, + 5EEF756E27BFA7BF007A1C99 /* Answers */, ); path = Model; sourceTree = ""; @@ -135,6 +134,15 @@ path = Controllers; sourceTree = ""; }; + 5EEF756E27BFA7BF007A1C99 /* Answers */ = { + isa = PBXGroup; + children = ( + 5E4D3FF327916B6C00A0861A /* Answer.swift */, + 5EEF756A27BF9042007A1C99 /* DemoData.swift */, + ); + path = Answers; + sourceTree = ""; + }; 5EF856012794395F00A9DE67 /* Screenshots */ = { isa = PBXGroup; children = ( diff --git a/MagicBall/Model/Answer.swift b/MagicBall/Model/Answers/Answer.swift similarity index 100% rename from MagicBall/Model/Answer.swift rename to MagicBall/Model/Answers/Answer.swift diff --git a/MagicBall/Model/DemoData.swift b/MagicBall/Model/Answers/DemoData.swift similarity index 100% rename from MagicBall/Model/DemoData.swift rename to MagicBall/Model/Answers/DemoData.swift From 6b0c977f21c21b6f419f57389efbbc16b7fd304e Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Fri, 18 Feb 2022 13:12:51 +0300 Subject: [PATCH 04/11] refactor --- MagicBall/Model/Network/NetworkManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MagicBall/Model/Network/NetworkManager.swift b/MagicBall/Model/Network/NetworkManager.swift index f6bedd4..faf9d66 100644 --- a/MagicBall/Model/Network/NetworkManager.swift +++ b/MagicBall/Model/Network/NetworkManager.swift @@ -15,7 +15,7 @@ class NetworkManager { func postRequest(completion: @escaping (ObtainResult) -> Void ) { - guard let url = URL(string: "https://8ball.delegator.com/magic/JSON/question_string") else { fatalError() } + guard let url = URL(string: "https://8ball.delegator.com/magic/JSON/question_string") else { return } session.dataTask(with: url) { [weak self] (data, response, error) in From 55d8f81e8616d960caac2ae56ed912ed91e2f995 Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Sun, 20 Feb 2022 09:31:42 +0300 Subject: [PATCH 05/11] refactor --- MagicBall.xcodeproj/project.pbxproj | 20 ++++++------------- .../Controllers/HomeViewController.swift | 4 ++-- MagicBall/Model/{Answers => }/DemoData.swift | 0 .../{Answers/Answer.swift => MagicBall.swift} | 6 +++--- .../{Model => }/Network/MagicBallAPI.swift | 0 .../{Model => }/Network/NetworkManager.swift | 0 6 files changed, 11 insertions(+), 19 deletions(-) rename MagicBall/Model/{Answers => }/DemoData.swift (100%) rename MagicBall/Model/{Answers/Answer.swift => MagicBall.swift} (88%) rename MagicBall/{Model => }/Network/MagicBallAPI.swift (100%) rename MagicBall/{Model => }/Network/NetworkManager.swift (100%) diff --git a/MagicBall.xcodeproj/project.pbxproj b/MagicBall.xcodeproj/project.pbxproj index 28f8871..ae5c66b 100644 --- a/MagicBall.xcodeproj/project.pbxproj +++ b/MagicBall.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ 5E4D3FE62790867600A0861A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E4D3FE52790867600A0861A /* Assets.xcassets */; }; 5E4D3FE92790867600A0861A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E4D3FE72790867600A0861A /* LaunchScreen.storyboard */; }; 5E4D3FF12790BC8000A0861A /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF02790BC7F00A0861A /* SettingsViewController.swift */; }; - 5E4D3FF427916B6C00A0861A /* Answer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF327916B6C00A0861A /* Answer.swift */; }; + 5E4D3FF427916B6C00A0861A /* MagicBall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF327916B6C00A0861A /* MagicBall.swift */; }; 5E4D3FF92791AC8500A0861A /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF82791AC8500A0861A /* NetworkManager.swift */; }; 5E4D3FFC2792E1DD00A0861A /* MagicBallAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FFB2792E1DD00A0861A /* MagicBallAPI.swift */; }; 5EEF756B27BF9042007A1C99 /* DemoData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EEF756A27BF9042007A1C99 /* DemoData.swift */; }; @@ -35,7 +35,7 @@ 5E4D3FE82790867600A0861A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 5E4D3FEA2790867600A0861A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5E4D3FF02790BC7F00A0861A /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; - 5E4D3FF327916B6C00A0861A /* Answer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Answer.swift; sourceTree = ""; }; + 5E4D3FF327916B6C00A0861A /* MagicBall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicBall.swift; sourceTree = ""; }; 5E4D3FF82791AC8500A0861A /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = ""; }; 5E4D3FFB2792E1DD00A0861A /* MagicBallAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicBallAPI.swift; sourceTree = ""; }; 5EEF756A27BF9042007A1C99 /* DemoData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoData.swift; sourceTree = ""; }; @@ -79,6 +79,7 @@ 5E4D3FDB2790867400A0861A /* MagicBall */ = { isa = PBXGroup; children = ( + 5E4D3FF72791AC5A00A0861A /* Network */, 5E4D3FF527916B7400A0861A /* Views */, 5E4D3FFA2791ACD600A0861A /* Controllers */, 5E4D3FF227916B5C00A0861A /* Model */, @@ -90,8 +91,8 @@ 5E4D3FF227916B5C00A0861A /* Model */ = { isa = PBXGroup; children = ( - 5E4D3FF72791AC5A00A0861A /* Network */, - 5EEF756E27BFA7BF007A1C99 /* Answers */, + 5E4D3FF327916B6C00A0861A /* MagicBall.swift */, + 5EEF756A27BF9042007A1C99 /* DemoData.swift */, ); path = Model; sourceTree = ""; @@ -134,15 +135,6 @@ path = Controllers; sourceTree = ""; }; - 5EEF756E27BFA7BF007A1C99 /* Answers */ = { - isa = PBXGroup; - children = ( - 5E4D3FF327916B6C00A0861A /* Answer.swift */, - 5EEF756A27BF9042007A1C99 /* DemoData.swift */, - ); - path = Answers; - sourceTree = ""; - }; 5EF856012794395F00A9DE67 /* Screenshots */ = { isa = PBXGroup; children = ( @@ -239,7 +231,7 @@ 5E4D3FDD2790867400A0861A /* AppDelegate.swift in Sources */, 5E4D3FDF2790867400A0861A /* SceneDelegate.swift in Sources */, 5E4D3FFC2792E1DD00A0861A /* MagicBallAPI.swift in Sources */, - 5E4D3FF427916B6C00A0861A /* Answer.swift in Sources */, + 5E4D3FF427916B6C00A0861A /* MagicBall.swift in Sources */, 5E4D3FF12790BC8000A0861A /* SettingsViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/MagicBall/Controllers/HomeViewController.swift b/MagicBall/Controllers/HomeViewController.swift index 5ac78bc..5c959e1 100644 --- a/MagicBall/Controllers/HomeViewController.swift +++ b/MagicBall/Controllers/HomeViewController.swift @@ -11,7 +11,7 @@ class HomeViewController: UIViewController { @IBOutlet weak var answerLabel: UILabel! - private let answer = Answer() + private let answer = MagicBall() override func viewDidLoad() { super.viewDidLoad() @@ -22,7 +22,7 @@ class HomeViewController: UIViewController { // MARK: - Shake motion override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { if motion == .motionShake { - answer.get(for: answerLabel) + answer.getAnswer(for: answerLabel) } } } diff --git a/MagicBall/Model/Answers/DemoData.swift b/MagicBall/Model/DemoData.swift similarity index 100% rename from MagicBall/Model/Answers/DemoData.swift rename to MagicBall/Model/DemoData.swift diff --git a/MagicBall/Model/Answers/Answer.swift b/MagicBall/Model/MagicBall.swift similarity index 88% rename from MagicBall/Model/Answers/Answer.swift rename to MagicBall/Model/MagicBall.swift index 9cd28ef..39cbd64 100644 --- a/MagicBall/Model/Answers/Answer.swift +++ b/MagicBall/Model/MagicBall.swift @@ -8,11 +8,11 @@ import Foundation import UIKit -class Answer { +class MagicBall { private let networkManager = NetworkManager() - - func get(for label: UILabel) { + + func getAnswer(for label: UILabel) { networkManager.postRequest { result in switch result { case .success(let answer): diff --git a/MagicBall/Model/Network/MagicBallAPI.swift b/MagicBall/Network/MagicBallAPI.swift similarity index 100% rename from MagicBall/Model/Network/MagicBallAPI.swift rename to MagicBall/Network/MagicBallAPI.swift diff --git a/MagicBall/Model/Network/NetworkManager.swift b/MagicBall/Network/NetworkManager.swift similarity index 100% rename from MagicBall/Model/Network/NetworkManager.swift rename to MagicBall/Network/NetworkManager.swift From 36a8b5d40d07117228769225cec4ca7848389676 Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Sun, 20 Feb 2022 09:45:11 +0300 Subject: [PATCH 06/11] refactor --- MagicBall.xcodeproj/project.pbxproj | 16 ++++++++++++---- MagicBall/{Model => Source}/DemoData.swift | 0 2 files changed, 12 insertions(+), 4 deletions(-) rename MagicBall/{Model => Source}/DemoData.swift (100%) diff --git a/MagicBall.xcodeproj/project.pbxproj b/MagicBall.xcodeproj/project.pbxproj index 8c873b3..c9d3f3a 100644 --- a/MagicBall.xcodeproj/project.pbxproj +++ b/MagicBall.xcodeproj/project.pbxproj @@ -18,8 +18,8 @@ 5E4D3FF427916B6C00A0861A /* MagicBall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF327916B6C00A0861A /* MagicBall.swift */; }; 5E4D3FF92791AC8500A0861A /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FF82791AC8500A0861A /* NetworkManager.swift */; }; 5E4D3FFC2792E1DD00A0861A /* MagicBallAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FFB2792E1DD00A0861A /* MagicBallAPI.swift */; }; - 5EEF756B27BF9042007A1C99 /* DemoData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EEF756A27BF9042007A1C99 /* DemoData.swift */; }; 5EDC6A0F27BBC06500C1B453 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 5EDC6A0E27BBC06500C1B453 /* README.md */; }; + 5EEF756B27BF9042007A1C99 /* DemoData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EEF756A27BF9042007A1C99 /* DemoData.swift */; }; 5EF855FE2794319800A9DE67 /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = 5EF855FD2794319800A9DE67 /* .gitignore */; }; 5EF8560427943B3200A9DE67 /* 002.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5EF8560227943B3200A9DE67 /* 002.jpg */; }; 5EF8560527943B3200A9DE67 /* 001.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5EF8560327943B3200A9DE67 /* 001.jpg */; }; @@ -39,8 +39,8 @@ 5E4D3FF327916B6C00A0861A /* MagicBall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicBall.swift; sourceTree = ""; }; 5E4D3FF82791AC8500A0861A /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = ""; }; 5E4D3FFB2792E1DD00A0861A /* MagicBallAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicBallAPI.swift; sourceTree = ""; }; - 5EEF756A27BF9042007A1C99 /* DemoData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoData.swift; sourceTree = ""; }; 5EDC6A0E27BBC06500C1B453 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 5EEF756A27BF9042007A1C99 /* DemoData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoData.swift; sourceTree = ""; }; 5EF855FD2794319800A9DE67 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; 5EF8560227943B3200A9DE67 /* 002.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 002.jpg; sourceTree = ""; }; 5EF8560327943B3200A9DE67 /* 001.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 001.jpg; sourceTree = ""; }; @@ -59,6 +59,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 5E40ECD927C21AB700E9A56F /* Source */ = { + isa = PBXGroup; + children = ( + 5EEF756A27BF9042007A1C99 /* DemoData.swift */, + ); + path = Source; + sourceTree = ""; + }; 5E4D3FD02790867400A0861A = { isa = PBXGroup; children = ( @@ -82,10 +90,11 @@ 5E4D3FDB2790867400A0861A /* MagicBall */ = { isa = PBXGroup; children = ( - 5E4D3FF72791AC5A00A0861A /* Network */, 5E4D3FF527916B7400A0861A /* Views */, 5E4D3FFA2791ACD600A0861A /* Controllers */, 5E4D3FF227916B5C00A0861A /* Model */, + 5E4D3FF72791AC5A00A0861A /* Network */, + 5E40ECD927C21AB700E9A56F /* Source */, 5E4D3FF627916BBF00A0861A /* SupportingFiles */, ); path = MagicBall; @@ -95,7 +104,6 @@ isa = PBXGroup; children = ( 5E4D3FF327916B6C00A0861A /* MagicBall.swift */, - 5EEF756A27BF9042007A1C99 /* DemoData.swift */, ); path = Model; sourceTree = ""; diff --git a/MagicBall/Model/DemoData.swift b/MagicBall/Source/DemoData.swift similarity index 100% rename from MagicBall/Model/DemoData.swift rename to MagicBall/Source/DemoData.swift From 216989756e0417c90f9631292a8b327ae5038acd Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Sun, 20 Feb 2022 21:37:51 +0300 Subject: [PATCH 07/11] refactor --- MagicBall.xcodeproj/project.pbxproj | 4 ++++ MagicBall/Controllers/HomeViewController.swift | 4 ++-- MagicBall/Model/MagicBall.swift | 3 ++- MagicBall/Source/DemoData.swift | 1 + MagicBall/Source/RandomAnswer.swift | 14 ++++++++++++++ 5 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 MagicBall/Source/RandomAnswer.swift diff --git a/MagicBall.xcodeproj/project.pbxproj b/MagicBall.xcodeproj/project.pbxproj index c9d3f3a..5fb81ba 100644 --- a/MagicBall.xcodeproj/project.pbxproj +++ b/MagicBall.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 5E3163EE27BBA12D00D90BF5 /* Algorithms in Frameworks */ = {isa = PBXBuildFile; productRef = 5E3163ED27BBA12D00D90BF5 /* Algorithms */; }; + 5E40ECDB27C2C1E200E9A56F /* RandomAnswer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E40ECDA27C2C1E200E9A56F /* RandomAnswer.swift */; }; 5E4D3FDD2790867400A0861A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FDC2790867400A0861A /* AppDelegate.swift */; }; 5E4D3FDF2790867400A0861A /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FDE2790867400A0861A /* SceneDelegate.swift */; }; 5E4D3FE12790867400A0861A /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FE02790867400A0861A /* HomeViewController.swift */; }; @@ -27,6 +28,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 5E40ECDA27C2C1E200E9A56F /* RandomAnswer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomAnswer.swift; sourceTree = ""; }; 5E4D3FD92790867400A0861A /* MagicBall.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MagicBall.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5E4D3FDC2790867400A0861A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 5E4D3FDE2790867400A0861A /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -63,6 +65,7 @@ isa = PBXGroup; children = ( 5EEF756A27BF9042007A1C99 /* DemoData.swift */, + 5E40ECDA27C2C1E200E9A56F /* RandomAnswer.swift */, ); path = Source; sourceTree = ""; @@ -245,6 +248,7 @@ 5E4D3FFC2792E1DD00A0861A /* MagicBallAPI.swift in Sources */, 5E4D3FF427916B6C00A0861A /* MagicBall.swift in Sources */, 5E4D3FF12790BC8000A0861A /* SettingsViewController.swift in Sources */, + 5E40ECDB27C2C1E200E9A56F /* RandomAnswer.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MagicBall/Controllers/HomeViewController.swift b/MagicBall/Controllers/HomeViewController.swift index 5c959e1..680e425 100644 --- a/MagicBall/Controllers/HomeViewController.swift +++ b/MagicBall/Controllers/HomeViewController.swift @@ -11,7 +11,7 @@ class HomeViewController: UIViewController { @IBOutlet weak var answerLabel: UILabel! - private let answer = MagicBall() + private let magicBall = MagicBall() override func viewDidLoad() { super.viewDidLoad() @@ -22,7 +22,7 @@ class HomeViewController: UIViewController { // MARK: - Shake motion override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { if motion == .motionShake { - answer.getAnswer(for: answerLabel) + magicBall.getAnswer(for: answerLabel) } } } diff --git a/MagicBall/Model/MagicBall.swift b/MagicBall/Model/MagicBall.swift index 39cbd64..63579ac 100644 --- a/MagicBall/Model/MagicBall.swift +++ b/MagicBall/Model/MagicBall.swift @@ -11,6 +11,7 @@ import UIKit class MagicBall { private let networkManager = NetworkManager() + private let randomAnswer = RandomAnswer() func getAnswer(for label: UILabel) { networkManager.postRequest { result in @@ -18,7 +19,7 @@ class MagicBall { case .success(let answer): label.text = answer case .failure(_): - label.text = DemoData.answers[Int.random(in: 0.. String { + return DemoData.answers[Int.random(in: 0.. Date: Sun, 20 Feb 2022 22:02:09 +0300 Subject: [PATCH 08/11] refactor --- MagicBall/Source/DemoData.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MagicBall/Source/DemoData.swift b/MagicBall/Source/DemoData.swift index 25ffe97..66c0fa9 100644 --- a/MagicBall/Source/DemoData.swift +++ b/MagicBall/Source/DemoData.swift @@ -9,5 +9,6 @@ import Foundation struct DemoData { static var answers = ["Just do it! 🤠", "You rock!🤘", "OMG 😱" , "You are awesome 😎", "WTF 🤬"] + private init() {} } From 1c9d2eabc6288e467b77376ac26a34c5fc9a209f Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Mon, 21 Feb 2022 11:48:52 +0300 Subject: [PATCH 09/11] refactor --- MagicBall/Controllers/HomeViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MagicBall/Controllers/HomeViewController.swift b/MagicBall/Controllers/HomeViewController.swift index 680e425..6b2304b 100644 --- a/MagicBall/Controllers/HomeViewController.swift +++ b/MagicBall/Controllers/HomeViewController.swift @@ -11,7 +11,7 @@ class HomeViewController: UIViewController { @IBOutlet weak var answerLabel: UILabel! - private let magicBall = MagicBall() + var magicBall = MagicBall() override func viewDidLoad() { super.viewDidLoad() From e2514790fa6c8a93831eba94600438db6dbd8380 Mon Sep 17 00:00:00 2001 From: Sergey Prikhodko Date: Wed, 23 Feb 2022 16:37:59 +0200 Subject: [PATCH 10/11] network manager protocol --- MagicBall/Model/MagicBall.swift | 6 +++++- MagicBall/Network/NetworkManager.swift | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/MagicBall/Model/MagicBall.swift b/MagicBall/Model/MagicBall.swift index 63579ac..db233c7 100644 --- a/MagicBall/Model/MagicBall.swift +++ b/MagicBall/Model/MagicBall.swift @@ -10,9 +10,13 @@ import UIKit class MagicBall { - private let networkManager = NetworkManager() + private let networkManager: NetworkManagerProtocol private let randomAnswer = RandomAnswer() + init(networkManager: NetworkManagerProtocol = NetworkManager()) { + self.networkManager = networkManager + } + func getAnswer(for label: UILabel) { networkManager.postRequest { result in switch result { diff --git a/MagicBall/Network/NetworkManager.swift b/MagicBall/Network/NetworkManager.swift index faf9d66..3faa922 100644 --- a/MagicBall/Network/NetworkManager.swift +++ b/MagicBall/Network/NetworkManager.swift @@ -7,7 +7,13 @@ import Foundation -class NetworkManager { +protocol NetworkManagerProtocol: AnyObject { + + func postRequest(completion: @escaping (ObtainResult) -> Void) + +} + +class NetworkManager: NetworkManagerProtocol { private let sessionConfiguration = URLSessionConfiguration.default private let session = URLSession.shared From 82032ed56180c6b1ee0d79f3b238b664afd23e14 Mon Sep 17 00:00:00 2001 From: Sergey Lukaschuk Date: Wed, 23 Feb 2022 18:33:48 +0300 Subject: [PATCH 11/11] fix Dependency Injection --- MagicBall.xcodeproj/project.pbxproj | 4 ---- MagicBall/Controllers/HomeViewController.swift | 13 ++++++++----- .../Controllers/SettingsViewController.swift | 9 ++++++--- MagicBall/Model/MagicBall.swift | 16 ++++++++++------ MagicBall/Network/NetworkManager.swift | 2 -- MagicBall/Source/DemoData.swift | 16 +++++++++++++--- MagicBall/Source/RandomAnswer.swift | 14 -------------- MagicBall/SupportingFiles/AppDelegate.swift | 2 +- 8 files changed, 38 insertions(+), 38 deletions(-) delete mode 100644 MagicBall/Source/RandomAnswer.swift diff --git a/MagicBall.xcodeproj/project.pbxproj b/MagicBall.xcodeproj/project.pbxproj index 5fb81ba..c9d3f3a 100644 --- a/MagicBall.xcodeproj/project.pbxproj +++ b/MagicBall.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 5E3163EE27BBA12D00D90BF5 /* Algorithms in Frameworks */ = {isa = PBXBuildFile; productRef = 5E3163ED27BBA12D00D90BF5 /* Algorithms */; }; - 5E40ECDB27C2C1E200E9A56F /* RandomAnswer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E40ECDA27C2C1E200E9A56F /* RandomAnswer.swift */; }; 5E4D3FDD2790867400A0861A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FDC2790867400A0861A /* AppDelegate.swift */; }; 5E4D3FDF2790867400A0861A /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FDE2790867400A0861A /* SceneDelegate.swift */; }; 5E4D3FE12790867400A0861A /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4D3FE02790867400A0861A /* HomeViewController.swift */; }; @@ -28,7 +27,6 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 5E40ECDA27C2C1E200E9A56F /* RandomAnswer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomAnswer.swift; sourceTree = ""; }; 5E4D3FD92790867400A0861A /* MagicBall.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MagicBall.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5E4D3FDC2790867400A0861A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 5E4D3FDE2790867400A0861A /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -65,7 +63,6 @@ isa = PBXGroup; children = ( 5EEF756A27BF9042007A1C99 /* DemoData.swift */, - 5E40ECDA27C2C1E200E9A56F /* RandomAnswer.swift */, ); path = Source; sourceTree = ""; @@ -248,7 +245,6 @@ 5E4D3FFC2792E1DD00A0861A /* MagicBallAPI.swift in Sources */, 5E4D3FF427916B6C00A0861A /* MagicBall.swift in Sources */, 5E4D3FF12790BC8000A0861A /* SettingsViewController.swift in Sources */, - 5E40ECDB27C2C1E200E9A56F /* RandomAnswer.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MagicBall/Controllers/HomeViewController.swift b/MagicBall/Controllers/HomeViewController.swift index 6b2304b..3893dd3 100644 --- a/MagicBall/Controllers/HomeViewController.swift +++ b/MagicBall/Controllers/HomeViewController.swift @@ -8,18 +8,21 @@ import UIKit class HomeViewController: UIViewController { - + + // MARK: - IBOutlets @IBOutlet weak var answerLabel: UILabel! - - var magicBall = MagicBall() - + + // MARK: - Private Properties + private var magicBall = MagicBall() + + // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() self.becomeFirstResponder() answerLabel.text = "Shake me!" } - // MARK: - Shake motion + // MARK: - Actions override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { if motion == .motionShake { magicBall.getAnswer(for: answerLabel) diff --git a/MagicBall/Controllers/SettingsViewController.swift b/MagicBall/Controllers/SettingsViewController.swift index 7c8ce3f..e5d49bb 100644 --- a/MagicBall/Controllers/SettingsViewController.swift +++ b/MagicBall/Controllers/SettingsViewController.swift @@ -9,13 +9,15 @@ import Foundation import UIKit class SettingsViewController: UIViewController { - + + // MARK: - Private Properties private let table: UITableView = { let table = UITableView() table.register(UITableViewCell.self, forCellReuseIdentifier: "cell") return table }() - + + // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() table.dataSource = self @@ -32,7 +34,8 @@ class SettingsViewController: UIViewController { super.viewDidLayoutSubviews() table.frame = view.bounds } - + + // MARK: - Public Methods @objc private func addTap() { let alert = UIAlertController( title: "Demo List Answers", diff --git a/MagicBall/Model/MagicBall.swift b/MagicBall/Model/MagicBall.swift index db233c7..2a18124 100644 --- a/MagicBall/Model/MagicBall.swift +++ b/MagicBall/Model/MagicBall.swift @@ -9,21 +9,25 @@ import Foundation import UIKit class MagicBall { - + + // MARK: - Private Properties private let networkManager: NetworkManagerProtocol - private let randomAnswer = RandomAnswer() - - init(networkManager: NetworkManagerProtocol = NetworkManager()) { + private let demoData: DemoDataProtocol + + // MARK: - Initializer + init(networkManager: NetworkManagerProtocol = NetworkManager(), demoData: DemoDataProtocol = DemoData()) { self.networkManager = networkManager + self.demoData = demoData } - + + // MARK: - Public Methods func getAnswer(for label: UILabel) { networkManager.postRequest { result in switch result { case .success(let answer): label.text = answer case .failure(_): - label.text = self.randomAnswer.get() + label.text = self.demoData.getRandomAnswer() } } } diff --git a/MagicBall/Network/NetworkManager.swift b/MagicBall/Network/NetworkManager.swift index 3faa922..2ec06e6 100644 --- a/MagicBall/Network/NetworkManager.swift +++ b/MagicBall/Network/NetworkManager.swift @@ -8,9 +8,7 @@ import Foundation protocol NetworkManagerProtocol: AnyObject { - func postRequest(completion: @escaping (ObtainResult) -> Void) - } class NetworkManager: NetworkManagerProtocol { diff --git a/MagicBall/Source/DemoData.swift b/MagicBall/Source/DemoData.swift index 66c0fa9..c7809d1 100644 --- a/MagicBall/Source/DemoData.swift +++ b/MagicBall/Source/DemoData.swift @@ -7,8 +7,18 @@ import Foundation -struct DemoData { - static var answers = ["Just do it! 🤠", "You rock!🤘", "OMG 😱" , "You are awesome 😎", "WTF 🤬"] - private init() {} + +protocol DemoDataProtocol: AnyObject { + func getRandomAnswer() -> String } +class DemoData: DemoDataProtocol { + + //MARK: - Singleton + static var answers = ["Just do it! 🤠", "You rock!🤘", "OMG 😱" , "You are awesome 😎", "WTF 🤬"] + + // MARK: - Public Methods + func getRandomAnswer() -> String { + return DemoData.answers[Int.random(in: 0.. String { - return DemoData.answers[Int.random(in: 0.. Bool { // Override point for customization after application launch. - + return true }