在我的应用程序中,用户可以通过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))
}
}
屏幕截图供参考:
请帮助我。
答案 0 :(得分:0)
在二读时,我想我明白了
您需要紧接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会更长一些,但是您始终可以将其重构为另一种方法。一般而言,它更像是“让我成为第一个与输入匹配的元素。如果没有找到任何元素,请进行一些后备,否则可以正常进行”。它还摆脱了使用索引遍历列表的问题。