Premier build : deux dialogues Siri refusés, la faute à une concaténation

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) <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-09-25 07:15:37 +00:00
parent 0d34908f4f
commit d41e8a457b

View File

@@ -121,9 +121,13 @@ struct HydrationStatusIntent: AppIntent {
if reste <= 0 { if reste <= 0 {
return .result(dialog: "\(LogDrinkIntent.enLitres(total)) : objectif atteint.") return .result(dialog: "\(LogDrinkIntent.enLitres(total)) : objectif atteint.")
} }
return .result(dialog: "\(LogDrinkIntent.enLitres(total)) sur " // ⚠️ UN SEUL littéral interpolé, jamais de concaténation.
+ "\(LogDrinkIntent.enLitres(objectif)). Il reste " // `IntentDialog` est `ExpressibleByStringInterpolation` : un littéral
+ "\(LogDrinkIntent.enLitres(reste)).") // 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 { func perform() async throws -> some IntentResult & ProvidesDialog {
guard let today = CoachWidgetStore.load()?.asOf(Date()).today else { guard let today = CoachWidgetStore.load()?.asOf(Date()).today else {
return .result(dialog: "Je n'ai pas encore ta séance du jour. " // Idem : pas de `+` dans un dialogue (cf. HydrationStatusIntent).
+ "Ouvre l'app une fois.") return .result(dialog: "Je n'ai pas encore ta séance du jour. Ouvre l'app une fois.")
} }
let sport = Self.sportEnFrancais(today.sport) let sport = Self.sportEnFrancais(today.sport)
if today.done { if today.done {