From 0dbf658de94090731508a2858cbc0c697a2afeb7 Mon Sep 17 00:00:00 2001 From: Florian Gabach Date: Mon, 10 Dec 2018 17:22:28 +0100 Subject: [PATCH] Small code refactoring --- .../project.pbxproj | 38 +++++++++++------- .../UserInterfaceState.xcuserstate | Bin 37839 -> 39594 bytes .../LicenceListViewController.swift | 21 +++------- .../Controller/OpenSourceTableViewCell.swift | 7 +--- .../Controller/OpenSourceViewController.swift | 9 +++-- Sources/Model/LicenceLoader.swift | 2 +- Sources/OpenSourceController.swift | 12 +++++- .../Array+Extensions.swift | 0 Sources/Utils/Reusable.swift | 19 +++++++++ Sources/Utils/UITableView+Extensions.swift | 28 +++++++++++++ .../UIView+Extensions.swift | 0 .../UIViewController+Extensions.swift | 0 12 files changed, 92 insertions(+), 44 deletions(-) rename Sources/{Extensions => Utils}/Array+Extensions.swift (100%) create mode 100644 Sources/Utils/Reusable.swift create mode 100644 Sources/Utils/UITableView+Extensions.swift rename Sources/{Extensions => Utils}/UIView+Extensions.swift (100%) rename Sources/{Extensions => Utils}/UIViewController+Extensions.swift (100%) diff --git a/OpenSourceController.xcodeproj/project.pbxproj b/OpenSourceController.xcodeproj/project.pbxproj index d669742..d5c962e 100644 --- a/OpenSourceController.xcodeproj/project.pbxproj +++ b/OpenSourceController.xcodeproj/project.pbxproj @@ -8,8 +8,6 @@ /* Begin PBXBuildFile section */ 52D6D9871BEFF229002C0205 /* OpenSourceController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52D6D97C1BEFF229002C0205 /* OpenSourceController.framework */; }; - 76229B6E2180AD6400A61697 /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B6C2180AD6400A61697 /* UIViewController+Extensions.swift */; }; - 76229B6F2180AD6400A61697 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B6D2180AD6400A61697 /* UIView+Extensions.swift */; }; 76229B722180AD8400A61697 /* LicenceLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B712180AD8400A61697 /* LicenceLoader.swift */; }; 76229B7D2180AD9F00A61697 /* HTTPDataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B7C2180AD9F00A61697 /* HTTPDataLoader.swift */; }; 76229B802180ADA800A61697 /* OpenSourceControllerConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76229B7E2180ADA800A61697 /* OpenSourceControllerConfig.swift */; }; @@ -18,7 +16,11 @@ 769FD9D221871DEC00FB5A53 /* LicenceListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769FD9CE21871DEC00FB5A53 /* LicenceListViewController.swift */; }; 769FD9D321871DEC00FB5A53 /* LoadingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769FD9CF21871DEC00FB5A53 /* LoadingViewController.swift */; }; 769FD9D421871DEC00FB5A53 /* OpenSourceTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769FD9D021871DEC00FB5A53 /* OpenSourceTableViewCell.swift */; }; - 76EAA8481E93EDB3009A41DA /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA8471E93EDB3009A41DA /* Array+Extensions.swift */; }; + 76D7F24521BEB18A004B74CB /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24021BEB18A004B74CB /* UITableView+Extensions.swift */; }; + 76D7F24621BEB18A004B74CB /* Reusable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24121BEB18A004B74CB /* Reusable.swift */; }; + 76D7F24721BEB18A004B74CB /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24221BEB18A004B74CB /* UIViewController+Extensions.swift */; }; + 76D7F24821BEB18A004B74CB /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24321BEB18A004B74CB /* Array+Extensions.swift */; }; + 76D7F24921BEB18A004B74CB /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D7F24421BEB18A004B74CB /* UIView+Extensions.swift */; }; 76EAA84F1E93EDCD009A41DA /* LicenceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */; }; /* End PBXBuildFile section */ @@ -35,8 +37,6 @@ /* Begin PBXFileReference section */ 52D6D97C1BEFF229002C0205 /* OpenSourceController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenSourceController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 52D6D9861BEFF229002C0205 /* OpenSourceController-iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenSourceController-iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 76229B6C2180AD6400A61697 /* UIViewController+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Extensions.swift"; path = "Sources/Extensions/UIViewController+Extensions.swift"; sourceTree = ""; }; - 76229B6D2180AD6400A61697 /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+Extensions.swift"; path = "Sources/Extensions/UIView+Extensions.swift"; sourceTree = ""; }; 76229B712180AD8400A61697 /* LicenceLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceLoader.swift; path = Sources/Model/LicenceLoader.swift; sourceTree = ""; }; 76229B7C2180AD9F00A61697 /* HTTPDataLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HTTPDataLoader.swift; path = Sources/Loader/HTTPDataLoader.swift; sourceTree = ""; }; 76229B7E2180ADA800A61697 /* OpenSourceControllerConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceControllerConfig.swift; path = Sources/OpenSourceControllerConfig.swift; sourceTree = ""; }; @@ -45,7 +45,11 @@ 769FD9CE21871DEC00FB5A53 /* LicenceListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceListViewController.swift; path = Sources/Controller/LicenceListViewController.swift; sourceTree = ""; }; 769FD9CF21871DEC00FB5A53 /* LoadingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoadingViewController.swift; path = Sources/Controller/LoadingViewController.swift; sourceTree = ""; }; 769FD9D021871DEC00FB5A53 /* OpenSourceTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceTableViewCell.swift; path = Sources/Controller/OpenSourceTableViewCell.swift; sourceTree = ""; }; - 76EAA8471E93EDB3009A41DA /* Array+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Extensions.swift"; path = "Sources/Extensions/Array+Extensions.swift"; sourceTree = ""; }; + 76D7F24021BEB18A004B74CB /* UITableView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UITableView+Extensions.swift"; path = "Sources/Utils/UITableView+Extensions.swift"; sourceTree = ""; }; + 76D7F24121BEB18A004B74CB /* Reusable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Reusable.swift; path = Sources/Utils/Reusable.swift; sourceTree = ""; }; + 76D7F24221BEB18A004B74CB /* UIViewController+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Extensions.swift"; path = "Sources/Utils/UIViewController+Extensions.swift"; sourceTree = ""; }; + 76D7F24321BEB18A004B74CB /* Array+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Extensions.swift"; path = "Sources/Utils/Array+Extensions.swift"; sourceTree = ""; }; + 76D7F24421BEB18A004B74CB /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+Extensions.swift"; path = "Sources/Utils/UIView+Extensions.swift"; sourceTree = ""; }; 76EAA84C1E93EDCD009A41DA /* LicenceFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceFile.swift; path = Sources/Model/LicenceFile.swift; sourceTree = ""; }; AD2FAA261CD0B6D800659CF4 /* OpenSourceController.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OpenSourceController.plist; sourceTree = ""; }; AD2FAA281CD0B6E100659CF4 /* OpenSourceControllerTests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OpenSourceControllerTests.plist; sourceTree = ""; }; @@ -114,14 +118,16 @@ name = Loader; sourceTree = ""; }; - 76EAA8491E93EDBB009A41DA /* Extensions */ = { + 76EAA8491E93EDBB009A41DA /* Utils */ = { isa = PBXGroup; children = ( - 76229B6D2180AD6400A61697 /* UIView+Extensions.swift */, - 76229B6C2180AD6400A61697 /* UIViewController+Extensions.swift */, - 76EAA8471E93EDB3009A41DA /* Array+Extensions.swift */, + 76D7F24321BEB18A004B74CB /* Array+Extensions.swift */, + 76D7F24121BEB18A004B74CB /* Reusable.swift */, + 76D7F24021BEB18A004B74CB /* UITableView+Extensions.swift */, + 76D7F24421BEB18A004B74CB /* UIView+Extensions.swift */, + 76D7F24221BEB18A004B74CB /* UIViewController+Extensions.swift */, ); - name = Extensions; + name = Utils; sourceTree = ""; }; 76EAA84A1E93EDC0009A41DA /* Sources */ = { @@ -132,7 +138,7 @@ 76229B7B2180AD8E00A61697 /* Loader */, 76229B702180AD7700A61697 /* Model */, 76EAA8511E93EDD2009A41DA /* Controller */, - 76EAA8491E93EDBB009A41DA /* Extensions */, + 76EAA8491E93EDBB009A41DA /* Utils */, ); name = Sources; sourceTree = ""; @@ -276,18 +282,20 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 76D7F24921BEB18A004B74CB /* UIView+Extensions.swift in Sources */, 76229B7D2180AD9F00A61697 /* HTTPDataLoader.swift in Sources */, - 76229B6F2180AD6400A61697 /* UIView+Extensions.swift in Sources */, + 76D7F24621BEB18A004B74CB /* Reusable.swift in Sources */, 769FD9D221871DEC00FB5A53 /* LicenceListViewController.swift in Sources */, 769FD9D121871DEC00FB5A53 /* OpenSourceViewController.swift in Sources */, + 76D7F24721BEB18A004B74CB /* UIViewController+Extensions.swift in Sources */, 76EAA84F1E93EDCD009A41DA /* LicenceFile.swift in Sources */, 76229B722180AD8400A61697 /* LicenceLoader.swift in Sources */, + 76D7F24521BEB18A004B74CB /* UITableView+Extensions.swift in Sources */, 769FD9D421871DEC00FB5A53 /* OpenSourceTableViewCell.swift in Sources */, + 76D7F24821BEB18A004B74CB /* Array+Extensions.swift in Sources */, 76229B812180ADA800A61697 /* OpenSourceController.swift in Sources */, - 76229B6E2180AD6400A61697 /* UIViewController+Extensions.swift in Sources */, 769FD9D321871DEC00FB5A53 /* LoadingViewController.swift in Sources */, 76229B802180ADA800A61697 /* OpenSourceControllerConfig.swift in Sources */, - 76EAA8481E93EDB3009A41DA /* Array+Extensions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/OpenSourceController.xcodeproj/project.xcworkspace/xcuserdata/floriangabach.xcuserdatad/UserInterfaceState.xcuserstate b/OpenSourceController.xcodeproj/project.xcworkspace/xcuserdata/floriangabach.xcuserdatad/UserInterfaceState.xcuserstate index f26f3a463cfec5b168f68e1bc21d950430bf3851..38ec9e30ceecaf1b5a013feeebe6405874dbe33a 100644 GIT binary patch delta 18650 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 UITableViewCell { - var cell = tableView.dequeueReusableCell(withIdentifier: self.reuseIdentifier, - for: indexPath) as? OpenSourceTableViewCell - // Init cell - if cell == nil { - cell = OpenSourceTableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: self.reuseIdentifier) - } - - // Configure the cell with licence - if let licence = self.downloadedLicence.get(at: indexPath.row) { - cell?.configure(licence: licence, config: self.config) - } - - return cell! + let cell: OpenSourceTableViewCell = tableView.dequeueReusableCell(for: indexPath) + guard let licence = self.downloadedLicence.get(at: indexPath.row) else { return cell } + cell.configure(licence: licence, config: self.config) + return cell } override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { diff --git a/Sources/Controller/OpenSourceTableViewCell.swift b/Sources/Controller/OpenSourceTableViewCell.swift index 77a6d6d..ebad072 100644 --- a/Sources/Controller/OpenSourceTableViewCell.swift +++ b/Sources/Controller/OpenSourceTableViewCell.swift @@ -6,7 +6,7 @@ import UIKit -final class OpenSourceTableViewCell: UITableViewCell { +final class OpenSourceTableViewCell: UITableViewCell, Reusable { // MARK: - Lifecycle @@ -29,15 +29,10 @@ final class OpenSourceTableViewCell: UITableViewCell { // MARK: - Configure - /// Initialize the cell content with Licence model - /// - /// - Parameter licence: the licence model func configure(licence: LicenceFile, config: OpenSourceControllerConfig) { - // Set text self.textLabel?.attributedText = licence.attributedContent self.textLabel?.textColor = config.uiConfig.licenceTextColor - // Background if let backgroundColor = config.uiConfig.licenceBackgroundColor { self.backgroundColor = backgroundColor } diff --git a/Sources/Controller/OpenSourceViewController.swift b/Sources/Controller/OpenSourceViewController.swift index 6789ca4..2908d4a 100644 --- a/Sources/Controller/OpenSourceViewController.swift +++ b/Sources/Controller/OpenSourceViewController.swift @@ -14,6 +14,8 @@ final class OpenSourceViewController: UIViewController { fileprivate var licences: [LicenceFile] + fileprivate var licenceLoader: LicenceLoader + fileprivate var config: OpenSourceControllerConfig fileprivate lazy var loadingController = { @@ -28,7 +30,8 @@ final class OpenSourceViewController: UIViewController { // MARK: - Lifecyle - init(licences: [LicenceFile], showCloseButton: Bool, configuration: OpenSourceControllerConfig) { + init(licences: [LicenceFile], showCloseButton: Bool, configuration: OpenSourceControllerConfig, licenceLoader: LicenceLoader) { + self.licenceLoader = licenceLoader self.licences = licences self.showCloseButton = showCloseButton self.config = configuration @@ -56,12 +59,10 @@ final class OpenSourceViewController: UIViewController { // MARK: - Prepare fileprivate func prepareStyle() { - // Apply navigation bar tint color if needed if let tintColor = self.config.uiConfig.barTintColor { self.navigationController?.navigationBar.barTintColor = tintColor } - // Apply navigation bar text color if needed if let textColor = self.config.uiConfig.titleColor { let attribut = [NSAttributedString.Key.foregroundColor: textColor] self.navigationController?.navigationBar.titleTextAttributes = attribut @@ -69,7 +70,7 @@ final class OpenSourceViewController: UIViewController { } fileprivate func prepareLicences() { - LicenceLoader.downloadLicences(licences: licences, config: config) { [weak self] in + self.licenceLoader.downloadLicences(licences: licences, config: config) { [weak self] in guard let strongSelf = self else { return } let listController = LicenceListViewController(downloadedLicence: strongSelf.licences, config: strongSelf.config) strongSelf.loadingController.remove() diff --git a/Sources/Model/LicenceLoader.swift b/Sources/Model/LicenceLoader.swift index d61a2ef..ce24bfd 100644 --- a/Sources/Model/LicenceLoader.swift +++ b/Sources/Model/LicenceLoader.swift @@ -13,7 +13,7 @@ final class LicenceLoader { /// - Parameters: /// - licences: array which contains licence model model /// - completion: end downloading completion - class func downloadLicences(licences: [LicenceFile], + func downloadLicences(licences: [LicenceFile], config: OpenSourceControllerConfig, completion: @escaping () -> Void) { let licenceGroupe = DispatchGroup() diff --git a/Sources/OpenSourceController.swift b/Sources/OpenSourceController.swift index 8f9c414..4084352 100644 --- a/Sources/OpenSourceController.swift +++ b/Sources/OpenSourceController.swift @@ -18,7 +18,11 @@ open class OpenSourceController: NSObject { /// /// - Parameter from: the source controller open func presentOpenSourceController(from: UIViewController) { - let licenceController = OpenSourceViewController(licences: licences, showCloseButton: true, configuration: config) + let loader: LicenceLoader = LicenceLoader() + let licenceController = OpenSourceViewController(licences: licences, + showCloseButton: true, + configuration: config, + licenceLoader: loader) let navController = UINavigationController(rootViewController: licenceController) from.present(navController, animated: true) } @@ -27,7 +31,11 @@ open class OpenSourceController: NSObject { /// /// - Parameter from: the source controller open func pushOpenSourceController(from: UIViewController) { - let licenceController = OpenSourceViewController(licences: licences, showCloseButton: false, configuration: config) + let loader: LicenceLoader = LicenceLoader() + let licenceController = OpenSourceViewController(licences: licences, + showCloseButton: false, + configuration: config, + licenceLoader: loader) guard let navigationController = from.navigationController else { assertionFailure("Source controller isn't embeded in navigation controller. Can't push.") return diff --git a/Sources/Extensions/Array+Extensions.swift b/Sources/Utils/Array+Extensions.swift similarity index 100% rename from Sources/Extensions/Array+Extensions.swift rename to Sources/Utils/Array+Extensions.swift diff --git a/Sources/Utils/Reusable.swift b/Sources/Utils/Reusable.swift new file mode 100644 index 0000000..c1b6086 --- /dev/null +++ b/Sources/Utils/Reusable.swift @@ -0,0 +1,19 @@ +// +// Reusable.swift +// OpenSourceControllerDemo +// +// Created by Florian Gabach on 10/12/2018. +// Copyright © 2018 OpenSourceController. All rights reserved. +// + +import Foundation + +public protocol Reusable: class { + static var reuseIdentifier: String { get } +} + +public extension Reusable { + static var reuseIdentifier: String { + return String(describing: self) + } +} diff --git a/Sources/Utils/UITableView+Extensions.swift b/Sources/Utils/UITableView+Extensions.swift new file mode 100644 index 0000000..44fbe4c --- /dev/null +++ b/Sources/Utils/UITableView+Extensions.swift @@ -0,0 +1,28 @@ +// +// UITableView+Extensions.swift +// OpenSourceControllerDemo +// +// Created by Florian Gabach on 10/12/2018. +// Copyright © 2018 OpenSourceController. All rights reserved. +// + +import UIKit + +extension UITableView { + final func register(cellType: T.Type) + where T: Reusable { + self.register(cellType.self, forCellReuseIdentifier: cellType.reuseIdentifier) + } + + final func dequeueReusableCell(for indexPath: IndexPath, cellType: T.Type = T.self) -> T + where T: Reusable { + guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else { + fatalError( + "Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self). " + + "Check that the reuseIdentifier is set properly in your XIB/Storyboard " + + "and that you registered the cell beforehand" + ) + } + return cell + } +} diff --git a/Sources/Extensions/UIView+Extensions.swift b/Sources/Utils/UIView+Extensions.swift similarity index 100% rename from Sources/Extensions/UIView+Extensions.swift rename to Sources/Utils/UIView+Extensions.swift diff --git a/Sources/Extensions/UIViewController+Extensions.swift b/Sources/Utils/UIViewController+Extensions.swift similarity index 100% rename from Sources/Extensions/UIViewController+Extensions.swift rename to Sources/Utils/UIViewController+Extensions.swift