Swift 3 – Как объявить NSOrderedSet для использования setVocabularyStrings?

Я хочу использовать прототип этой функции для добавление словаря в SiriKit. Документация Apple показывает следующий пример кода:

let workoutNames = self.sortedWorkoutNames()
let vocabulary = INVocabulary.shared()
vocabulary.setVocabularyStrings(workoutNames, of: .workoutActivityName)

Согласно документации, мне нужно использовать тип NSOrderedSet для self.sortedWorkoutNames() .

Как объявить его и установить с помощью массива Strings?

РЕДАКТИРОВАТЬ: Что касается контекстного проекта, я использую намерения с Siri. Цель здесь состоит в том, чтобы использовать конкретное слово, такое как «жим лежа» или «курица», просто для запуска моего приложения для тренировок с уже реализованным INStartWorkoutIntent и работающим как шарм.


person Danyl    schedule 05.04.2017    source источник
comment
developer.apple.com/reference/foundation/nsorderedset Существует convenience init(array: [Any]). Так что-то вроде этого: let workoutNames = NSOrdered.init(["word1", word2"])?   -  person Larme    schedule 05.04.2017
comment
Спасибо за ответ, но он не работает...   -  person Danyl    schedule 05.04.2017
comment
это не работает, это безумно неинформативно. Если что-то не работает, укажите конкретную ошибку, которую вы получаете, или почему это не соответствует вашим потребностям.   -  person Duncan C    schedule 05.04.2017


Ответы (1)


Если вы посмотрите на пример кода Apple для SiriKit, вы увидите, что их функция sortedWorkoutNames() возвращает NSOrderedSet. Посмотрите на тип workoutNames в версии Objective-C:

NSOrderedSet* workoutNames = [self sortedWorkoutNames];

В Swift это будет

let workoutNames: NSOrderedSet = self.sortedWorkoutNames()

Если у вас есть массив, который вы хотите передать INVocabulary.setVocabularyStrings(_:of:), вам нужно преобразовать его в упорядоченный набор. Как сказал @larme в своем комментарии, NSOrderedSet имеет инициализатор, который принимает массив в качестве входных данных.

Ваш код может выглядеть так:

let myVocab = ["Benchpress", "Squats", "Deadlift"]
let myVocabSet = NSOrderedSet(array: myVocab) //Convert myVocab to an NSOrderedSet

let vocabulary = INVocabulary.shared()
vocabulary.setVocabularyStrings(myVocabSet, of: .workoutActivityName)
person Duncan C    schedule 05.04.2017
comment
Спасибо за ваш ответ ! Я нашел аналогичный на GitHub, но у меня возникла проблема, даже используя ваш, с «setVocabularyStrings», Xcode сообщает мне: «setVocabularyStrings (_: of:)» недоступен: INVocabulary недоступен для расширений. Основное приложение отвечает за предоставление всего словарного запаса». Я пропускаю импорт или что-то в этом роде? Мой текущий импорт - это UIKit и Intents. - person Danyl; 05.04.2017
comment
недоступен для расширений? Вы пытаетесь написать расширение для приложения? Вам необходимо предоставить более полное описание вашей проблемы. Пожалуйста, вернитесь и отредактируйте свой вопрос, чтобы предоставить больше информации. - person Duncan C; 05.04.2017
comment
Я делаю это в Intent. Подождите, я отредактирую свой главный вопрос. - person Danyl; 05.04.2017
comment
Готово, извините за этот беспорядок. - person Danyl; 05.04.2017
comment
Так не могли бы вы помочь мне, пожалуйста? - person Danyl; 05.04.2017
comment
Я раньше не пользовался SiriKit. Моя информация основана на чтении документов. Если вы пытаетесь добавить словарный запас из расширения приложения, похоже, вам не повезло. - person Duncan C; 05.04.2017
comment
Хорошо, надеюсь найду. Я опубликую ответ, если мне удастся решить мою проблему. Спасибо за ваше время и ваши ответы @Duncan C. - person Danyl; 05.04.2017
comment
Словарь, поддерживающий намерение, должен быть добавлен в базовое приложение, а не намерение. - person JKaz; 09.09.2018