Saltar al contenido

Cómo guardar un array de objetos a NSUserDefault con swift?

Posterior a de nuestra larga recopilación de datos dimos con la respuesta este atolladero que presentan muchos de nuestros usuarios. Te ofrecemos la respuesta y deseamos resultarte de gran apoyo.

Solución:

rápido 4

Necesitamos serializar nuestro swift objeto para guardarlo en userDefaults.

En Swift 4 podemos usar el protocolo Codable, que nos facilita la serialización y el análisis JSON.

Flujo de trabajo (Guardar objeto Swift en UserDefaults):

  1. Confirme el protocolo Codificable para modelar la clase (clase Lugar: Codificable).
  2. Crear objeto de clase.
  3. Serialice esa clase usando la clase JsonEncoder.
  4. Guarde el objeto serializado (datos) en UserDefaults.

Flujo de trabajo (Obtenga objeto rápido de UserDefaults):

  1. Obtenga datos de UserDefaults (que devolverá el objeto serializado (datos))
  2. Decodificar datos usando la clase JsonDecoder

Código rápido 4:

class Place: Codable 
    var latitude: Double
    var longitude: Double

    init(lat : Double, long: Double) 
        self.latitude = lat
        self.longitude = long
    

    public static func savePlaces()
        var placeArray = [Place]()
        let place1 = Place(lat: 10.0, long: 12.0)
        let place2 = Place(lat: 5.0, long: 6.7)
        let place3 = Place(lat: 4.3, long: 6.7)
        placeArray.append(place1)
        placeArray.append(place2)
        placeArray.append(place3)
        let placesData = try! JSONEncoder().encode(placeArray)
        UserDefaults.standard.set(placesData, forKey: "places")
    

    public static func getPlaces() -> [Place]?
        let placeData = UserDefaults.standard.data(forKey: "places")
        let placeArray = try! JSONDecoder().decode([Place].self, from: placeData!)
        return placeArray
    

De la guía de programación de la lista de propiedades:

Si un objeto de lista de propiedades es un contenedor (es decir, un array o diccionario), todos los objetos contenidos en él también deben ser objetos de lista de propiedades. Si una array o el diccionario contiene objetos que no son objetos de la lista de propiedades, entonces no puede guardar y restaurar la jerarquía de datos utilizando los diversos métodos y funciones de la lista de propiedades.

Deberá convertir el objeto a y desde un NSData instancia usando NSKeyedArchiver y NSKeyedUnarchiver.

Por ejemplo:

func savePlaces()
    let placesArray = [Place(lat: 123, lng: 123, name: "hi")]
    let placesData = NSKeyedArchiver.archivedDataWithRootObject(placesArray)
    NSUserDefaults.standardUserDefaults().setObject(placesData, forKey: "places")


func loadPlaces()
    let placesData = NSUserDefaults.standardUserDefaults().objectForKey("places") as? NSData

    if let placesData = placesData 
        let placesArray = NSKeyedUnarchiver.unarchiveObjectWithData(placesData) as? [Place]

        if let placesArray = placesArray 
            // do something…
        

    

Rápido 3 y 4

El siguiente es el código de ejemplo completo en Swift 3 y 4.

import Foundation

class Place: NSObject, NSCoding 

    var latitude: Double
    var longitude: Double
    var name: String

    init(latitude: Double, longitude: Double, name: String) 
        self.latitude = latitude
        self.longitude = longitude
        self.name = name
    

    required init?(coder aDecoder: NSCoder) 
        self.latitude = aDecoder.decodeDouble(forKey: "latitude")
        self.longitude = aDecoder.decodeDouble(forKey: "longitude")
        self.name = aDecoder.decodeObject(forKey: "name") as? String ?? ""
    

    func encode(with aCoder: NSCoder) 
        aCoder.encode(latitude, forKey: "latitude")
        aCoder.encode(longitude, forKey: "longitude")
        aCoder.encode(name, forKey: "name")
    


func savePlaces() 
    var placesArray: [Place] = []
    placesArray.append(Place(latitude: 12, longitude: 21, name: "place 1"))
    placesArray.append(Place(latitude: 23, longitude: 32, name: "place 2"))
    placesArray.append(Place(latitude: 34, longitude: 43, name: "place 3"))

    let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
    UserDefaults.standard.set(placesData, forKey: "places")


func loadPlaces() 
    guard let placesData = UserDefaults.standard.object(forKey: "places") as? NSData else 
        print("'places' not found in UserDefaults")
        return
    

    guard let placesArray = NSKeyedUnarchiver.unarchiveObject(with: placesData as Data) as? [Place] else 
        print("Could not unarchive from placesData")
        return
    

    for place in placesArray 
        print("")
        print("place.latitude: (place.latitude)")
        print("place.longitude: (place.longitude)")
        print("place.name: (place.name)")
    

Ejemplo de uso:

savePlaces()
loadPlaces()

Salida de la consola:

place.latitude: 12.0
place.longitude: 21.0
place.name: 'place 1'

place.latitude: 23.0
place.longitude: 32.0
place.name: 'place 2'

place.latitude: 34.0
place.longitude: 43.0
place.name: 'place 3'

Aquí puedes ver las reseñas y valoraciones de los usuarios

Tienes la posibilidad compartir este enunciado si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *