Обратите внимание, что этот подход, используемый в вашем вопросе и опубликованных ответах, не будет работать для нескольких объектов. Что вы должны сделать, это расширить UserDefaults и добавить статическое свойство, вложенное в структуру Window следующим образом:
extension UserDefaults {
struct Window { }
}
extension UserDefaults.Window {
static var x: CGFloat {
get {
return CGFloat(UserDefaults.standard.object(forKey: "Window.x") as? Double ?? 2.0)
}
set {
UserDefaults.standard.set(Double(newValue), forKey: "Window.x")
}
}
static var y: CGFloat {
get {
return CGFloat(UserDefaults.standard.object(forKey: "Window.y") as? Double ?? 3.0)
}
set {
UserDefaults.standard.set(Double(newValue), forKey: "Window.y")
}
}
}
Тестирование игровой площадки
UserDefaults.Window.x // 2 default value
UserDefaults.Window.x = 10
UserDefaults.Window.x // 10
Лучшим подходом (как уже упоминалось @Sulthan в комментариях) было бы слияние свойств x и y в свойстве точки (CGPoint)
extension UserDefaults.Window {
static var point: CGPoint {
get {
guard let data = UserDefaults.standard.data(forKey: "Window.point") else { return CGPoint(x: 2, y: 3) }
return (NSKeyedUnarchiver.unarchiveObject(with: data) as? NSValue)?.cgPointValue ?? CGPoint(x: 2, y: 3)
}
set {
UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: newValue), forKey: "Window.point")
}
}
}
Тестирование игровой площадки
UserDefaults.Window.point // {x 2 y 3} default value
UserDefaults.Window.point = .zero
UserDefaults.Window.point // {x 0 y 0}