Created
March 22, 2020 05:49
-
-
Save reyandrey/09515974376dabb896b9d431ea73acdd to your computer and use it in GitHub Desktop.
UserDefaults property wrapper example
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
import UIKit | |
import Foundation | |
/// Обертка, которая позволи хранить переменные сразу в UserDefaults | |
@propertyWrapper public struct UserDefaultsStandart<T> { | |
/// Ключи | |
public enum Key: String { | |
case foo | |
case bar | |
} | |
/// Ключ для хранения в UserDefaults | |
private let key: Key | |
/// Значение по умолчанию | |
private let defaultValue: T | |
/// Инициализатор должен быть объявлен публичным, для доступа к нему в других модулях | |
/// - Parameters: | |
/// - key: Ключ для хранения в UserDefaults | |
/// - defaultValue: Значение по умолчанию, если по данному ключу ничего нет | |
init(key: UserDefaultsStandart.Key, defaultValue: T) { | |
self.key = key | |
self.defaultValue = defaultValue | |
} | |
/// Процесс обертывания переменной, через переопределения геттера и сеттера | |
public var wrappedValue: T { | |
get { return UserDefaults.standard.object(forKey: key.rawValue) as? T ?? defaultValue } | |
set { UserDefaults.standard.set(newValue, forKey: key.rawValue) } | |
} | |
} | |
// Пример | |
public struct UserSettings { | |
@UserDefaultsStandart(key: .foo, defaultValue: true) | |
public static var someBoolValue: Bool | |
@UserDefaultsStandart(key: .bar, defaultValue: "") | |
public static var someString: String | |
} | |
print("UserSettings.someBoolValue = \(UserSettings.someBoolValue)") | |
print("UserSettings.someString = \(UserSettings.someString)") | |
UserSettings.someBoolValue = false | |
UserSettings.someString = UUID().uuidString | |
print("UserSettings.someBoolValue = \(UserSettings.someBoolValue)") | |
print("UserSettings.someString = \(UserSettings.someString)") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment