From d41e8a457ba5ed23d4d4d37e8777c3a7e0400704 Mon Sep 17 00:00:00 2001 From: Sylvain Bettinelli Date: Fri, 25 Sep 2026 07:15:37 +0000 Subject: [PATCH] =?UTF-8?q?Premier=20build=20:=20deux=20dialogues=20Siri?= =?UTF-8?q?=20refus=C3=A9s,=20la=20faute=20=C3=A0=20une=20concat=C3=A9nati?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erreurs remontées par Xcode sur le Mac : CoachIntents.swift:126 Cannot convert value of type 'String' to expected argument type 'IntentDialog' CoachIntents.swift:152 idem `IntentDialog` est `ExpressibleByStringInterpolation` : un littéral interpolé passe — et les sept autres dialogues du fichier passent pour cette raison — mais l'opérateur `+` produit une `String`, que le compilateur refuse. Mes deux seules phrases écrites sur plusieurs lignes avec `+` étaient donc les deux seules à casser. Corrigé : un littéral d'un seul tenant pour la phrase courte, et `IntentDialog(stringLiteral:)` pour celle qui se construit à partir de trois valeurs. Le commentaire dit pourquoi, pour que la prochaine phrase longue ne reparte pas sur un `+`. ⚠️ Exactement le genre d'erreur annoncée au commit précédent : rien de ce code ne compile sur Linux, la vérification croisée des symboles ne voit pas les types. Il fallait le build pour la trouver. Co-Authored-By: Claude Opus 5 (1M context) --- ios/App/App/CoachIntents.swift | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ios/App/App/CoachIntents.swift b/ios/App/App/CoachIntents.swift index 3e78f9e..a1638b6 100644 --- a/ios/App/App/CoachIntents.swift +++ b/ios/App/App/CoachIntents.swift @@ -121,9 +121,13 @@ struct HydrationStatusIntent: AppIntent { if reste <= 0 { return .result(dialog: "\(LogDrinkIntent.enLitres(total)) : objectif atteint.") } - return .result(dialog: "\(LogDrinkIntent.enLitres(total)) sur " - + "\(LogDrinkIntent.enLitres(objectif)). Il reste " - + "\(LogDrinkIntent.enLitres(reste)).") + // ⚠️ UN SEUL littéral interpolé, jamais de concaténation. + // `IntentDialog` est `ExpressibleByStringInterpolation` : un littéral + // passe, mais l'opérateur `+` produit une `String`, que le compilateur + // refuse — « Cannot convert value of type 'String' to expected argument + // type 'IntentDialog' ». Erreur rencontrée au premier build, 25/09. + let phrase = "\(LogDrinkIntent.enLitres(total)) sur \(LogDrinkIntent.enLitres(objectif)). Il reste \(LogDrinkIntent.enLitres(reste))." + return .result(dialog: IntentDialog(stringLiteral: phrase)) } } @@ -148,8 +152,8 @@ struct TodaySessionIntent: AppIntent { func perform() async throws -> some IntentResult & ProvidesDialog { guard let today = CoachWidgetStore.load()?.asOf(Date()).today else { - return .result(dialog: "Je n'ai pas encore ta séance du jour. " - + "Ouvre l'app une fois.") + // Idem : pas de `+` dans un dialogue (cf. HydrationStatusIntent). + return .result(dialog: "Je n'ai pas encore ta séance du jour. Ouvre l'app une fois.") } let sport = Self.sportEnFrancais(today.sport) if today.done {