CLPlacemark et Realm

Bonjour à tous,

J’essaie de ne pas trop solliciter le forum, en faisant mes recherches moi-même, mais là, j’avoue que je suis un peu perdu et ne sais plus dans quelle direction chercher.

Je crée une application qui recense l’adresse d’objets et les place sur une carte en utilisant MapKit. Chaque objet a donc une localisation. J’ai créé une struct Place.

struct Place: Identifiable, Equatable {
    var id = UUID().uuidString
    var placemark: CLPlacemark
}

J’ai aussi créé une class RealmPlace qui hérite de Object pour préparer les données des objets à envoyer en base de données avec Realm.
Or ma struct a une instance placemark: CLPlacemark

var placemark: CLPlacemark?

Sauf que Realm n’accepte pas d’enregistrer des variables de type CLPlacemark (c’eut été trop beau !). J’aimerais donc la transformer en Data. Et c’est là que je coince…

Par conséquent, j’ai essayé de découper mon CLPlacemark avec ses sous-éléments compatibles Realm.
(Ne vous préoccupez pas des underscores_, c’est juste que j’ai protégé mes données avec des var get set. Et c’est là aussi que j’enregistre dans Realm)

class RealmPlace : Object {

    var placemark: CLPlacemark?
    @objc dynamic var _id = UUID().uuidString
    @objc private dynamic var _latitude = 0.0
    @objc private dynamic var _longitude = 0.0
    @objc private dynamic var _country = ""
    @objc private dynamic var _locality = ""
    @objc private dynamic var _name = ""
    @objc private dynamic var _subThoroughfare = ""
    @objc private dynamic var _thoroughfare = ""

convenience init(place: Place) {
        self.init()
        self.id = place.id
        self.latitude = (place.placemark.location?.coordinate.latitude)!
        self.longitude = (place.placemark.location?.coordinate.longitude)!
        self.subThoroughfare = place.placemark.subThoroughfare ?? ""
        self.thoroughfare = place.placemark.thoroughfare ?? ""
        self.name = place.placemark.name ?? ""
        self.locality = place.placemark.locality ?? ""
        self.country = place.placemark.country ?? ""
    }

J’avais pour idée d’ensuite recréer un CLPlacemark à replacer dans mon objet Place et à utiliser dans mon application. Mais impossible de le recréer, je bute sur un obstacle, c’est là que je coince !

L’idée, c’était de terminer ma reconstruction d’objet Place comme suit:

 var placeObject: Place {
        return Place(id: self.id, placemark: createPlacemark())
    }

J’espère avoir été suffisamment clair.
Peut-être suis-je parti dans la mauvaise direction !?!
Si quelqu’un a une idée pour enregistrer mes CLPlacemark avec Realm, je suis preneur.

Merci d’avoir pris le temps de me lire.
Bon week-end les Giraffes

Salut @Behache,

Le problème est que les propriétés de CLPlacemark, sont en lecture seule. C’est pour ça que tu as get-only perperty.

Donc, tu ne peux pas écrire dans ces valeurs (set en anglais).

En cherchant dans la doc Apple, le seul init que tu peux utiliser pour faire ça est celui-ci :

init(location: CLLocation, name: String?, postalAddress: CNPostalAddress?)

Bien sûr, il faudra que tu te conformes à chaque classe de chaque élément de cet init pour qui fonctionne.

Plus d’info dans la doc :

https://developer.apple.com/documentation/corelocation/clplacemark

Bonjour et merci @ThonyF,

Merci pour ce retour rapide. J’avais vu ça dans la doc, mais j’avoue que cela ne me parle pas beaucoup (hé oui, j’ai encore pas mal de progrès à faire).
Je vais faire des recherches, mais pour m’orienter pourrais-tu un peu guider la démarche globale.
Est-ce que je dois créer une nouvelle classe Placemark avec une variable placemark qui serait initialisée avec ce constructeur ? Et ensuite, il faut que je replace les objets créés dans ma classe Place ?
Suis-je dans la bonne logique ?

En te remerciant de nouveau.
Belle journée à toi.

C’est tout bon, j’ai trouvé la solution à mon problème.
Merci @ThonyF

1 J'aime