From 842766060f8b5da7d451330d0cd7ac0319d251f0 Mon Sep 17 00:00:00 2001 From: Mustafa Merza <mustafa.merza95@gmail.com> Date: Wed, 17 Jul 2024 12:40:23 +0300 Subject: [PATCH] - Added some files to support basic dependency injection. --- MiniScanner.xcodeproj/project.pbxproj | 24 +++++++++++++++ MiniScanner/DependencyInjection/Clear.swift | 19 ++++++++++++ .../DependencyInjector.swift | 29 +++++++++++++++++++ MiniScanner/DependencyInjection/Inject.swift | 18 ++++++++++++ MiniScanner/DependencyInjection/Provide.swift | 19 ++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 MiniScanner/DependencyInjection/Clear.swift create mode 100644 MiniScanner/DependencyInjection/DependencyInjector.swift create mode 100644 MiniScanner/DependencyInjection/Inject.swift create mode 100644 MiniScanner/DependencyInjection/Provide.swift diff --git a/MiniScanner.xcodeproj/project.pbxproj b/MiniScanner.xcodeproj/project.pbxproj index 62636d0..1acca28 100644 --- a/MiniScanner.xcodeproj/project.pbxproj +++ b/MiniScanner.xcodeproj/project.pbxproj @@ -172,6 +172,10 @@ 53F21FA12C1377B900172BFC /* Tajawal-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 53F21F9A2C1377B900172BFC /* Tajawal-Black.ttf */; }; 672C46442C47B1F300497EF0 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 672C46432C47B1F300497EF0 /* Localizable.xcstrings */; }; 672C464A2C47BD8800497EF0 /* String+StringKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46492C47BD8800497EF0 /* String+StringKeys.swift */; }; + 672C46622C47C74300497EF0 /* DependencyInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46612C47C74300497EF0 /* DependencyInjector.swift */; }; + 672C46642C47C74800497EF0 /* Provide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46632C47C74800497EF0 /* Provide.swift */; }; + 672C46662C47C74C00497EF0 /* Inject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46652C47C74C00497EF0 /* Inject.swift */; }; + 672C46682C47C75100497EF0 /* Clear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C46672C47C75100497EF0 /* Clear.swift */; }; B827E5196CC419E773B843E1 /* Pods_MiniScanner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9A37DC9F9A8E3AF632DFB98 /* Pods_MiniScanner.framework */; }; EC0CF1FE254D8BBF00888722 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0CF1FD254D8BBF00888722 /* AppDelegate.swift */; }; EC0CF200254D8BBF00888722 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0CF1FF254D8BBF00888722 /* SceneDelegate.swift */; }; @@ -394,6 +398,10 @@ 53F21F9A2C1377B900172BFC /* Tajawal-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Tajawal-Black.ttf"; sourceTree = "<group>"; }; 672C46432C47B1F300497EF0 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; }; 672C46492C47BD8800497EF0 /* String+StringKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+StringKeys.swift"; sourceTree = "<group>"; }; + 672C46612C47C74300497EF0 /* DependencyInjector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependencyInjector.swift; sourceTree = "<group>"; }; + 672C46632C47C74800497EF0 /* Provide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Provide.swift; sourceTree = "<group>"; }; + 672C46652C47C74C00497EF0 /* Inject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Inject.swift; sourceTree = "<group>"; }; + 672C46672C47C75100497EF0 /* Clear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clear.swift; sourceTree = "<group>"; }; E8AF4FB39674DF589D719DCF /* Pods-MiniScanner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiniScanner.release.xcconfig"; path = "Target Support Files/Pods-MiniScanner/Pods-MiniScanner.release.xcconfig"; sourceTree = "<group>"; }; E9A37DC9F9A8E3AF632DFB98 /* Pods_MiniScanner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MiniScanner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EC0CF1FA254D8BBF00888722 /* MiniScanner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MiniScanner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -922,6 +930,17 @@ path = Localization; sourceTree = "<group>"; }; + 672C46602C47C70F00497EF0 /* DependencyInjection */ = { + isa = PBXGroup; + children = ( + 672C46612C47C74300497EF0 /* DependencyInjector.swift */, + 672C46632C47C74800497EF0 /* Provide.swift */, + 672C46652C47C74C00497EF0 /* Inject.swift */, + 672C46672C47C75100497EF0 /* Clear.swift */, + ); + path = DependencyInjection; + sourceTree = "<group>"; + }; 98E49D3F46C8E62718825860 /* Pods */ = { isa = PBXGroup; children = ( @@ -952,6 +971,7 @@ EC0CF1FC254D8BBF00888722 /* MiniScanner */ = { isa = PBXGroup; children = ( + 672C46602C47C70F00497EF0 /* DependencyInjection */, EC702548254E1F9F00BE1958 /* Managers */, 535983F02C144E79003EB6ED /* Helpers */, EC8A9B0A254DC2FD00F9AF99 /* Extensions */, @@ -1268,6 +1288,7 @@ 539996922C27130000671340 /* ConstraintLayoutGuide.swift in Sources */, 539996A32C27130000671340 /* ConstraintLayoutSupportDSL.swift in Sources */, 53D9D1C52C1AF521004D1C1C /* MyExtention.swift in Sources */, + 672C46662C47C74C00497EF0 /* Inject.swift in Sources */, 535983F22C144E87003EB6ED /* Keys.swift in Sources */, 539996962C27130000671340 /* ConstraintOffsetTarget.swift in Sources */, EC70252C254E066400BE1958 /* SettingsViewController.swift in Sources */, @@ -1281,6 +1302,7 @@ 53014FAA2C11A8E80071CE39 /* Quadrilateral.swift in Sources */, 539996832C27130000671340 /* ConstraintMakerPriortizable.swift in Sources */, 5399969E2C27130000671340 /* Debugging.swift in Sources */, + 672C46682C47C75100497EF0 /* Clear.swift in Sources */, 5399968E2C27130000671340 /* ConstraintMakerRelatable+Extensions.swift in Sources */, 539996512C26E86700671340 /* DefaultValues.m in Sources */, 53014FA42C11A8E80071CE39 /* EditScanViewController.swift in Sources */, @@ -1301,6 +1323,7 @@ 535983EF2C142C9F003EB6ED /* Localization.swift in Sources */, 539996892C27130000671340 /* ConstraintDSL.swift in Sources */, 539996952C27130000671340 /* ConstraintConstantTarget.swift in Sources */, + 672C46622C47C74300497EF0 /* DependencyInjector.swift in Sources */, 539996902C27130000671340 /* UILayoutSupport+Extensions.swift in Sources */, 53014F992C11A8E80071CE39 /* CGPoint+Utils.swift in Sources */, 53E7D3392C1B00880025A1D3 /* FSPageViewLayout.swift in Sources */, @@ -1318,6 +1341,7 @@ ECE9BBAA254E295900D45E43 /* Date+Extensions.swift in Sources */, 53014FA92C11A8E80071CE39 /* QuadrilateralView.swift in Sources */, 539996802C27130000671340 /* ConstraintMultiplierTarget.swift in Sources */, + 672C46642C47C74800497EF0 /* Provide.swift in Sources */, 53CD5F562C1503150010424B /* BMViewController.swift in Sources */, 539996822C27130000671340 /* ConstraintDescription.swift in Sources */, EC702546254E1E9E00BE1958 /* WalkthroughModel.swift in Sources */, diff --git a/MiniScanner/DependencyInjection/Clear.swift b/MiniScanner/DependencyInjection/Clear.swift new file mode 100644 index 0000000..b0b6a0a --- /dev/null +++ b/MiniScanner/DependencyInjection/Clear.swift @@ -0,0 +1,19 @@ +// +// Clear.swift +// MiniScanner +// +// Created by Mustafa Merza on 7/17/24. +// Copyright © 2024 AppsNectar. All rights reserved. +// + +import Foundation + +@propertyWrapper struct Clear<T> { + + var wrappedValue: T + + init() { + self.wrappedValue = DependencyInjector.resolve() + DependencyInjector.clear(dependency: wrappedValue) + } +} diff --git a/MiniScanner/DependencyInjection/DependencyInjector.swift b/MiniScanner/DependencyInjection/DependencyInjector.swift new file mode 100644 index 0000000..350a6a0 --- /dev/null +++ b/MiniScanner/DependencyInjection/DependencyInjector.swift @@ -0,0 +1,29 @@ +// +// DependencyInjector.swift +// MiniScanner +// +// Created by Mustafa Merza on 7/17/24. +// Copyright © 2024 AppsNectar. All rights reserved. +// + +import Foundation + +struct DependencyInjector { + + private static var dependencyList: [String: Any] = [:] + + static func resolve<T>() -> T { + guard let t = dependencyList[String(describing: T.self)] as? T else { + fatalError("No provider registerd for type: \(T.self)") + } + return t + } + + static func register<T>(dependency: T) { + dependencyList[String(describing: T.self)] = dependency + } + + static func clear<T>(dependency: T) { + dependencyList.removeValue(forKey: String(describing: T.self)) + } +} diff --git a/MiniScanner/DependencyInjection/Inject.swift b/MiniScanner/DependencyInjection/Inject.swift new file mode 100644 index 0000000..814c260 --- /dev/null +++ b/MiniScanner/DependencyInjection/Inject.swift @@ -0,0 +1,18 @@ +// +// Inject.swift +// MiniScanner +// +// Created by Mustafa Merza on 7/17/24. +// Copyright © 2024 AppsNectar. All rights reserved. +// + +import Foundation + +@propertyWrapper struct Inject<T> { + + var wrappedValue: T + + init() { + self.wrappedValue = DependencyInjector.resolve() + } +} diff --git a/MiniScanner/DependencyInjection/Provide.swift b/MiniScanner/DependencyInjection/Provide.swift new file mode 100644 index 0000000..80046e2 --- /dev/null +++ b/MiniScanner/DependencyInjection/Provide.swift @@ -0,0 +1,19 @@ +// +// Provide.swift +// MiniScanner +// +// Created by Mustafa Merza on 7/17/24. +// Copyright © 2024 AppsNectar. All rights reserved. +// + +import Foundation + +@propertyWrapper struct Provide<T> { + + var wrappedValue: T + + init(wrappedValue: T) { + self.wrappedValue = wrappedValue + DependencyInjector.register(dependency: wrappedValue) + } +} -- GitLab