无法读取INAddTasksIntent中的歧义消除结果

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)

屏幕截图以供参考:

屏幕截图

请帮我。

Ger*_*ero 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))  
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这与流程更接近、更快速地匹配。当然,该guard语句的 else 有点长,但您始终可以将其重构为另一种方法。一般来说,它更像是“让我找到与输入匹配的第一个元素。如果找不到任何元素,请执行一些后备操作,否则正常进行”。它还摆脱了使用索引迭代列表的情况。