Created
November 6, 2020 17:39
-
-
Save MojtabaHs/c9e701ef8f7e034c672268815c8cd3e9 to your computer and use it in GitHub Desktop.
A property wrapper for easy access to the settings bundle.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@propertyWrapper | |
public struct SettingsBundleStorage<T> { | |
private let key: String | |
private let userDefaults: UserDefaults = .standard | |
public init(key: String) { | |
self.key = key | |
setBundleDefaults(plist: .root) | |
setBundleDefaults(plist: .child(name: "DeveloperOptions")) | |
} | |
public var wrappedValue: T { | |
get { userDefaults.value(forKey: key) as! T } | |
set { userDefaults.set(newValue, forKey: key) } | |
} | |
} | |
extension SettingsBundleStorage { | |
func setBundleDefaults(plist: PList = .root) { | |
let settingsName = "Settings" | |
let settingsExtension = "bundle" | |
let settingsPreferencesItems = "PreferenceSpecifiers" | |
let settingsPreferenceKey = "Key" | |
let settingsPreferenceDefaultValue = "DefaultValue" | |
guard let settingsBundleURL = Bundle.main.url(forResource: settingsName, withExtension: settingsExtension), | |
let settingsData = try? Data(contentsOf: settingsBundleURL.appendingPathComponent(plist.name)), | |
let settingsPlist = try? PropertyListSerialization.propertyList( | |
from: settingsData, | |
options: [], | |
format: nil) as? [String: Any], | |
let settingsPreferences = settingsPlist?[settingsPreferencesItems] as? [[String: Any]] else { | |
return assertionFailure("Can not get the \(plist.name) from the bundle: \(settingsName)") | |
} | |
var defaultsToRegister = [String: Any]() | |
settingsPreferences.forEach { preference in | |
if let key = preference[settingsPreferenceKey] as? String { | |
defaultsToRegister[key] = preference[settingsPreferenceDefaultValue] | |
} | |
} | |
UserDefaults.standard.register(defaults: defaultsToRegister) | |
} | |
} | |
extension SettingsBundleStorage { | |
enum PList { | |
case root | |
case child(name: String) | |
var name: String { | |
var file: String | |
switch self { | |
case .root: file = "Root" | |
case .child(let name): file = name.replacingOccurrences(of: ".plist", with: "") | |
} | |
file.append(".plist") | |
return file | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment