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:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user