ios - 无法读取 INAddTasksIntent 中的消歧结果

标签 ios swift siri 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))  
    }  
}  

引用截图:

screenshot

请帮帮我。

最佳答案

二读时我想我明白了:

您需要在完成(.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/

相关文章:

ios - 动画 UIView 形状及其内容

javascript - 在 jquery mobile 上启用缩放效果

ios - 二元运算符“==”不能应用于两个结构操作数

xcode - Xcode 7 中的 XCTest : how to verify some text exists in the view

ios - 如何将核心数据添加到实用程序

swift - 为什么在递归 Swift 枚举中需要 indirect 关键字?

arrays - 将返回类型更改为小数?

ios - Siri 集成 : Audio call using Siri?

ios - 如何使用 SiriKit 通过 Web 服务发送数据?