Swift - Как получить индекс элемента словаря от значения? - PullRequest
0 голосов
/ 03 июня 2018

Я использую массив словаря (Swift 4.1) для хранения значения имени языка и кода языка:

var voiceLanguagesList: [Dictionary<String, String>] = []

Я добавляю массив словаря этим методом:

for voice in AVSpeechSynthesisVoice.speechVoices() {
            let voiceLanguageCode = (voice as AVSpeechSynthesisVoice).language

            if let languageName = Locale.current.localizedString(forLanguageCode: voiceLanguageCode) {
                let dictionary = [ControllerConstants.ChooseLanguage.languageName: languageName, ControllerConstants.ChooseLanguage.languageCode: voiceLanguageCode]

                voiceLanguagesList.append(dictionary)
            }
        }

Теперь допустим, что я сохранил значение элемента в userDefaults:

let languageName = UserDefaults.standard.object(forKey: ControllerConstants.UserDefaultsKeys.languageName) as? String
        let languageCode = UserDefaults.standard.object(forKey: ControllerConstants.UserDefaultsKeys.languageCode) as? String

Я хочу получить индекс словаря, в котором значение равноlanguageName и languageCode.Я просмотрел другие ответы, но не нашел хорошего решения.

SourceCode: https://github.com/imjog/susi_iOS/tree/voice

Ссылка на файл: https://github.com/imjog/susi_iOS/blob/voice/Susi/Controllers/LanguagePickerController/LanguagePickerController.swift

Ответы [ 5 ]

0 голосов
/ 18 января 2019

У меня есть массив словарей, в которых словарь имеет тип <String,Any>.

После некоторых исследований и проб и поисков я нашел кое-что, что работает для меня.

if let index = yourArray?.firstIndex(
                where: {
                  ($0 as AnyObject)["Title"] as? String == NSLocalizedString("New Location", comment: "")
            }
                )
            {
                print(index)
                //your operations here

            }

PS - ($ 0 как AnyObject) ["Заголовок"] как?Строка - это текст, который вы хотите найти ..

0 голосов
/ 04 июня 2018

Словарь является парным ключом-значением

Если вы хотите получить индекс элемента Dictionary из значения.
Вы можете попробовать с массивом кортежей, как показано ниже:

let dict = [("key0", "value0"), ("key1", "value1")]
let index = dict.index { $1 == "value1" } ?? 0
print(index)    // 1

Надеюсь, это полезно!

0 голосов
/ 03 июня 2018

Я не вижу необходимости использовать словарь здесь.Вы можете просто создать язык нового типа и выполнить поиск, как показано ниже.

struct Language: Equatable {
    var code: String
    var name: String
}

var languages = [Language]()
languages.append(Language(code: "1", name: "English"))
languages.append(Language(code: "2", name: "Hindi"))

let languageToSearch = Language(code: "2", name: "Hindi")

print(languages.index(of: languageToSearch) ?? "Not found")
0 голосов
/ 03 июня 2018

Как уже говорили другие, я не вижу смысла в использовании массива словарей в качестве модели для представления вашей таблицы ... однако, если я понял ваш вопрос, это могло бы помочь?Привет

var testDictArray: [Dictionary<String, String>] = [] // Just a test, an array of dictionaries

// Filling the dictionary with example data
testDictArray.append(
    ["A0":"a0",
    "B0":"b0",
    "C0":"c0"]
)
testDictArray.append(
    ["A1":"a1",
     "B1":"b1",
     "C1":"c1",
     "D1":"d1"]
)
testDictArray.append(
    ["A2":"a2",
     "B2":"b2"]
)

// The example values you want to find
let upperCase = "B2"
let lowerCase = "b2"

// Some loops...
var foundedIndex: Int? = nil
for index in 0..<testDictArray.count {
    for (key, value) in testDictArray[index] {
        if (key, value) == (upperCase, lowerCase) {
            foundedIndex = index
            break
        }
    }
    if foundedIndex != nil {
        break
    }
}

// Printing result
if let myIndex = foundedIndex {
    print("The index is \(myIndex)") // The example returns 2
} else {
    print("No index found :(")
}
0 голосов
/ 03 июня 2018

Словари не упорядочены.У них нет индекса.У словарей есть ключи, которые имеют некоторое значение, которое можно хэшировать.

Все ключи в словаре уникальны, но не все значения являются.

Вы можете иметь словарь типа [String:Int] со значениями

["a": 1, "b": 1, "c": 1]

Каков ключ для значения 1 в этом случае?Будет ли любой ключ, который содержит это значение, в порядке?В этом случае вы можете перебирать пары ключ / значение до тех пор, пока не найдете подходящее значение и не вернете этот ключ, но нет такого понятия, как first совпадающее значение, потому что, как уже упоминалось, словари не упорядочены.

...