Lecture et écriture de champs numériques dans CoreData

Bonjour,
CoreData fonctionne très bien avec les String mais dès que je veux manipuler des nombres, c’est l’impasse pour mon champs longueur:
Dans la vue du formulaire cela semble marcher mais c’est peut être un peu fragile:

 @State private var modele = ""
    @State private var longueur = Double(0.00)
    
    let types = ["Voilier", "Moteur"]
    
    var body: some View {
        NavigationView {
            Form {
Section {
                    TextField("Longueur", value: $longueur, formatter: NumberFormatter())
                }

Mais dans la vue ou j’affiche le détail de l’enregistrement, j’ai toujours une erreur de compilation:

 Text(bateau.type ?? "Type inconnu")
                
                Text(bateau.longueur ?? 0.00)
                    
            }

Ce qui produit un "No exact matches in call to initializer "

je n’ai trouvé aucun tuto qui traite des champs numériques DOUBLE dans avec SwiftUI et CoreData.
Ils font presque tous un TO DO avec que des string

Quelqu’un pourrait-il me dire ou je peux trouver la bonne syntaxe et les explications correspondantes.
Merci de votre aide

Je ne comprends pas bien quel est le modèle, il faudrait voir le fichier .xcdatamodeld avec ton entité et ses attributs et quels sont-ils : entité bateau, attribut type (String) et longueur (Double) par exemple ? Tu as choisi la génération automatique d’une classe à partir de l’entité ? Et alors, c’est modele ou bateau ? Parce que je ne suis pas sûr que ce soit un problème de syntaxe des Double, elle a l’air correcte.

Merci de me répondre
le modele est classique et l’enregistrement dans Coredata fonctionne parfaitement tant qu’il n’y a pas de champs double. J’ai pu saisir et afficher sans problème bles champs texte: Nom, type, marque…

Bonjour,

Maintenant, il faut que tu donnes plus de détails (du code quoi) sur:

  • la vue qui pose problème (déclaration de « bateau » dans cette vue notamment)
  • l’appel à cette vue avec en particulier les variables / bindings, etc… qui sont transférées vers cette vue

Cordialement,
Nicolas

Mon problème de syntaxe est là, ligne 21:

Bonjour,

Je pense que Text attend un String et que tu lui passes un Double ?

Cordialement,
Nicolas

Text("/(bateau.longueur ?? 0.00)")

Merci ristretto,
c’est mieux avec
Text("(bateau.longueur ?? 0.00)")
Je n’ai plus d’erreur de compilation.
Mais du coup cela me retourne : 0.000000
Ce qui veut dire que la saisie dans le formulaire:

Section {
                    TextField("Longueur", value: $longueur, formatter: NumberFormatter())
                }

n’est pas correcte ou en tout cas ne fonctionne pas…
Je m’en doutais un peu mais n’ai rien trouvé sue le sujet : saisie d’un double dans un formulaire!
Cordialement
Holliver

il faut passer par une fonction pour arrondir le résultat je pense. (genre à 2 décimales).

Merci à tous, cela marche,
je n’ai plus qu’à arrondir l’affichage ce qui ne devrait pas poser de problème…
Cordialement
Holliver

Pour ceux qui cherchent a afficher un double avec 2 chiffres apres la virgule et un m pour unité mètre:

Text("\(bateau.longueur, specifier: "%.2f") m")

@Holliver si tu veux en savoir plus sur les codes de formatage des chaines de caractères.

Je t’invite à consulter le site ci-dessous. Par contre, il est fait pour Python, mais tu comprendras mieux ce que tu utilises.

Merci pour ce bon conseil car venant du php il va falloir que je m’habitue aux types de variable stricte dans Switch.

NumberFormatter est très puissant; pour limiter à deux les chiffres après la virgule, il faut le spécifier à NumberFormatter. Exemple :

var numberFormatter = NumberFormatter()
numberFormatter.minimumFractionDigits = 2
numberFormatter.string(from: longueur) = 0.00 // si longueur est égale à 0.000000

L’exemple est tiré de la doc officielle d’Apple, car je ne suis guère doctus sine libro, comme on dit en presque latin.