raj*_*ala 5 ios siri swift sirikit
在我的应用程序中,用户可以通过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))
}
}
Run Code Online (Sandbox Code Playgroud)
屏幕截图以供参考:
请帮我。
在第二次阅读时,我想我看到了:
您需要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))
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这与流程更接近、更快速地匹配。当然,该guard语句的 else 有点长,但您始终可以将其重构为另一种方法。一般来说,它更像是“让我找到与输入匹配的第一个元素。如果找不到任何元素,请执行一些后备操作,否则正常进行”。它还摆脱了使用索引迭代列表的情况。
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |