Невозможно прочитать результат устранения неоднозначности в INAddTasksIntent - PullRequest
5 голосов
/ 03 июля 2019

В моем приложении пользователи могут добавлять задачи в списки с помощью Sirikit (пример запроса о намерениях Siri: «В MyApp добавьте в список расходов 100 долларов на джинсы»).если предложенный список недоступен в приложении, я прошу устранить неоднозначность.

результат множественного выбора в неоднозначности не фиксируется в resolTargetTaskList.

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

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 09 июля 2019

Во втором чтении, кажется, вижу:

Вам нужно 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))  
}

Это соответствует, мне кажется, потоку немного ближе и более быстрым способом. Конечно, оператор else для оператора guard немного длиннее, но вы всегда можете изменить его в другом методе. В общем, это больше похоже на «достань мне первый элемент, который соответствует входным данным. Если ты не найдешь ни одного, сделай какой-нибудь запасной вариант, в противном случае действуй как обычно». Это также избавляет от перебора списка с индексом.

...