Преобразовать 2 аналогичных вычисленных свойства, чтобы использовать 1 повторно используемую функцию в Swift? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть 2 аналогичных вычисленных свойства, таких как x & y

struct Window {
    let defaults = UserDefaults.standard

    var x: String {
        get {
            let x = defaults.string(forKey: "x")
            return x ?? "3"
        }
        set {
            defaults.set(newValue, forKey: "x")
        }
    }

    var y: String {
        get {
            let y = defaults.string(forKey: "y")
            return y ?? "10"
        }
        set {
            defaults.set(newValue, forKey: "y")
        }
    }
}

И так как x & y делают то же самое, я хочу, чтобы это было функцией многократного использования, принимающей 2 разных параметра, имя forKey, например, "x" & "y" & defaultValue, например, "2" или «3» в приведенном выше примере.

Я новичок в Swift и не могу понять, насколько это возможно или слишком просто. Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Обратите внимание, что этот подход, используемый в вашем вопросе и опубликованных ответах, не будет работать для нескольких объектов. Что вы должны сделать, это расширить 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}
0 голосов
/ 29 августа 2018
struct Window {
    let defaults = UserDefaults.standard

    var x: String {
        get {
            return getValue(for:"x", defaultValue: "3")
        }
        set {
            set(value: newValue, for:"x")
        }
    }

    var y: String {
        get {
            return getValue(for:"y", defaultValue: "10")
        }
        set {
            set(value: newValue, for:"y")
        }
    }

    func getValue(for key:String, defaultValue:String) -> String {
        let value = defaults.string(forKey: key)
        return value ?? defaultValue
    }

    func set(value:String, for key:String) {
        defaults.set(value, forKey:key)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...