在我的应用程序中,用户可以通过 Sirikit 添加任务到列表(例如 Siri 意图查询:“在 MyApp 中添加到费用列表 100 美元买牛仔裤”)。如果建议的列表在应用程序中不可用,我要求消除歧义。
消歧多选的结果没有被resolveTargetTaskList捕获。
intent.targetTaskList?.title 是我第一次尝试传递的值。结果,它进入了一个无限循环。
func resolveTargetTaskList(for intent: INAddTasksIntent, with completion: @escaping (INTaskListResolutionResult) -> Void) {
guard let title = intent.targetTaskList?.title else {
completion(.needsValue())
print("no title value")
}
completeResolveTaskList(listName: intent.targetTaskList!.title, with: completion)
}
public func completeResolveTaskList(listName: INSpeakableString, with completion: @escaping (INTaskListResolutionResult) -> Void) {
print("completeResolveTaskList")
let allLists = getAllLists()
for index in 0...(allLists.count - 1) {
if allLists[index].spokenPhrase.lowercased() == listName.spokenPhrase.lowercased() {
completion(.success(with: taskLists[index]))
}
}
switch allLists.count {
case 0:
completion(.unsupported())
default:
completion(.disambiguation(with: taskLists))
}
}
引用截图:
请帮帮我。
最佳答案
二读时我想我明白了:
您需要在完成(.success(with: taskLists[index]))
之后立即return
,否则您仍然会执行函数的其余部分,其中包括递归调用。
一般来说,我建议您像这样修改您的函数:
public func completeResolveTaskList(listName: INSpeakableString, with completion: @escaping (INTaskListResolutionResult) -> Void) {
print("completeResolveTaskList")
let allLists = getAllLists()
guard let matching = allLists.first(where: { $0.spokenPhrase.lowercased() == listName.spokenPhrase.lowercased() }) else {
switch allLists.count {
case 0:
completion(.unsupported())
default:
completion(.disambiguation(with: taskLists))
}
return
}
completion(.success(with: matching))
}
在我看来,这与流程更接近并且更 swift 。当然,guard
语句的 else 稍长一些,但您始终可以将其重构为另一种方法。一般来说,它更像是“给我第一个与输入匹配的元素。如果你没有找到任何东西,做一些回退,否则正常进行”。它还摆脱了使用索引迭代列表。
关于ios - 无法读取 INAddTasksIntent 中的消歧结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871522/