ios - 无法读取 INAddTasksIntent 中的消歧结果
问题描述
在我的应用程序中,用户可以通过 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))
}
}
截图供参考:
请帮我。
解决方案
在第二次阅读时,我想我明白了:
您需要在return
之后立即completion(.success(with: taskLists[index]))
执行,否则您仍将执行该函数的其余部分,其中包括递归调用。
一般来说,我建议像这样修改你的函数:
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))
}
这匹配,imo,流程更接近和更迅速的方式。当然,该guard
语句的 else 稍长一些,但您始终可以将其重构为另一种方法。一般来说,它更像是“让我找到与输入匹配的第一个元素。如果你没有找到,做一些后备,否则正常进行”。它还摆脱了使用索引对列表的迭代。
推荐阅读
- ranking - 信息检索中排名结果的评估
- javascript - 无法从函数返回数组
- reactjs - 函数的useSelector钩子?
- android - Android 更新并取回 recyclerview 内容
- c++ - How to declare a variable whose type is the generics of another object?
- azure - 使用 powershell 将 Azure 测试计划克隆到新的区域路径
- go - Golang pongo2 过滤器返回不正确的值
- javascript - FullCalendar 错误:未捕获的 TypeError:calendar.fullCalendar 不是函数
- c++ - 当具体消息是从 XML 自动生成的 C++ 类时的通用消息
- android - 电容器为用户设置所需的应用程序版本