Skip to content

Instantly share code, notes, and snippets.

@MojtabaHs
Created November 6, 2020 17:39
Show Gist options
  • Save MojtabaHs/c9e701ef8f7e034c672268815c8cd3e9 to your computer and use it in GitHub Desktop.
Save MojtabaHs/c9e701ef8f7e034c672268815c8cd3e9 to your computer and use it in GitHub Desktop.
A property wrapper for easy access to the settings bundle.
@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