struct ContentView: View {
var body: some View {
VStack(spacing: 20) {
Button {
UserDefaults.standard.set("FalSe", forKey: "hideView")
UserDefaults.standard.set("10", forKey: "intValue")
UserDefaults.standard.set("500.20", forKey: "floatValue")
} label: {
Text("Save Data")
}
Button {
print("HideView: ", PUserDefaults.shouldHideView)
print("IntValue: ", PUserDefaults.udInt)
print("FloatValue: ", PUserDefaults.udFLoat)
print("Nullable ", PUserDefaults.udString)
} label: {
Text("Print UDs")
}
}
}
}
@propertyWrapper
struct PUserDefaultsWrapper {
let key: UserDefaultsKey
let defaultValue: T
init(_ key: UserDefaultsKey, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
guard let value = UserDefaults.standard.string(forKey: key.name) else {
return defaultValue
}
if let convertedValue = T(value) {
return convertedValue
}
return defaultValue
}
}
}
struct PUserDefaults {
@PUserDefaultsWrapper(.shouldHideView, defaultValue: true)
static var shouldHideView: Bool
@PUserDefaultsWrapper(.intValue, defaultValue: 0)
static var udInt: Int
@PUserDefaultsWrapper(.floatValue, defaultValue: 0.0)
static var udFLoat: Float
@PUserDefaultsWrapper(.nullable, defaultValue: "")
static var udString: String
}
enum UserDefaultsKey {
case shouldHideView
case intValue
case floatValue
case nullable
var name: String {
switch self {
case .shouldHideView:
"hideView"
case .intValue:
"intValue"
case .floatValue:
"floatValue"
case .nullable:
"nullable"
}
}
}
Важные примечания:
Мое значение пользователя всегда будет строкой, оно может быть "true", "1000", "false". /> Я хотел бы не отдавать как t (значение), когда тип данных уже является строкой, в данном случае я хотел бы просто вернуть значение, полученное из userdefaults < /li>
Я хотел бы вернуть True в случае, если мое значение «true», «true»; То же самое для «false», «false» значений.
вы думаете, что этот подход станет более сложным, и лучше обрабатывать простое расширение пользователей?
var wrappedValue: T { get { guard let value = UserDefaults.standard.string(forKey: key.name) else { return defaultValue }
if let convertedValue = T(value) { return convertedValue }
return defaultValue } } }
struct PUserDefaults { @PUserDefaultsWrapper(.shouldHideView, defaultValue: true) static var shouldHideView: Bool @PUserDefaultsWrapper(.intValue, defaultValue: 0) static var udInt: Int @PUserDefaultsWrapper(.floatValue, defaultValue: 0.0) static var udFLoat: Float @PUserDefaultsWrapper(.nullable, defaultValue: "") static var udString: String }
enum UserDefaultsKey { case shouldHideView case intValue case floatValue case nullable
var name: String { switch self { case .shouldHideView: "hideView" case .intValue: "intValue" case .floatValue: "floatValue" case .nullable: "nullable" } } } [/code] [b] Важные примечания: [/b] [list] [*] Мое значение пользователя всегда будет строкой, оно может быть "true", "1000", "false". /> Я хотел бы не отдавать как t (значение), когда тип данных уже является строкой, в данном случае я хотел бы просто вернуть значение, полученное из userdefaults < /li> Я хотел бы вернуть True в случае, если мое значение «true», «true»; То же самое для «false», «false» значений. [/list] вы думаете, что этот подход станет более сложным, и лучше обрабатывать простое расширение пользователей?