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):
- Confirme el protocolo Codificable para modelar la clase (clase Lugar: Codificable).
- Crear objeto de clase.
- Serialice esa clase usando la clase JsonEncoder.
- Guarde el objeto serializado (datos) en UserDefaults.
Flujo de trabajo (Obtenga objeto rápido de UserDefaults):
- Obtenga datos de UserDefaults (que devolverá el objeto serializado (datos))
- 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ó.