Обновите и удалите объект внутри userDefaults по INDEX

Я создал 3 объекта и сохранил каждый из них внутри пользовательских настроек по умолчанию. Как я могу обновить не все данные, а только объект номер 3?

Это код, как я сохраняю и извлекаю данные:

  func savePlayer(player: [Player]) {
        UserDefaults.standard.set(try? PropertyListEncoder().encode(player), forKey:"player")
        UserDefaults.standard.synchronize()
    }
    
    func getSports() -> [Player]? {
        if let data = UserDefaults.standard.value(forKey:"player") as? Data {
            let decodedSports = try? PropertyListDecoder().decode([Player].self, from: data)
            return decodedSports
        }
        return nil
    }

Это мои объекты:

let playerOne = Player(id: 1, url: "https:\\www.google - 1.com", color: "#color 1", image: "imageBase64One", flag: false, position: 1)

let playerTwo = Player(id: 2, url: "https:\\www.google - 2.com", color: "#color 2", image: "imageBase64Two", flag: false, position: 2)

let playerThree = Player(id: 3, url: "https:\\www.google - 3.com", color: "#color 3", image: "imageBase64Three", flag: false, position: 3)

Модель данных:

class Player: Codable {
    let ID: Int
    let URL: String
    let Color: String
    let Image: String
    var Flag: Bool
    let Position: Int
    
    init(id: Int, url: String, color: String, image: String, flag: Bool, position: Int) {
        self.ID = id
        self.URL = url
        self.Color = color
        self.Image = image
        self.Flag = flag
        self.Position = position
    }
}

Я не могу понять, как обновить, например, флаг опции для второго объекта, а также удалить только два объекта, а не все.


person Ice    schedule 04.11.2020    source источник
comment
Когда вы вызываете getSports, вы возвращаете массив объектов, поэтому просто относитесь к нему как к любому другому массиву объектов, а когда закончите вносить изменения, снова вызовите savePlayer.   -  person Joakim Danielson    schedule 04.11.2020
comment
Не связано, но никогда не используйте value(forKey из UserDefaults для получения Data. Есть data(forKey:   -  person vadian    schedule 04.11.2020
comment
Спасибо за помощь ;)   -  person Ice    schedule 05.11.2020


Ответы (1)


Нет необходимости устанавливать в вашем классе положение каждого элемента и нет необходимости вызывать UserDefaults.standard.synchronize(), так как он устарел.

В любом случае, всякий раз, когда вы хотите редактировать объект из своего массива:

  1. определите свой массив и добавьте к нему свои объекты:
var myArray: [Player] = []!
  1. вызовите позицию массива, который вы хотите отредактировать, если вы хотите отредактировать второй объект, то:
myArray[2] =  Player(id: 15, url: "https:\\www.niceUrl.com", color: .black, image: "niceImage", flag: true, position: 2)
savePlayer(player: myArray[2])

Обратите внимание, что здесь я изменил все значения, если вы хотите изменить только одно, вы можете это сделать.

person Marybnq    schedule 04.11.2020