【问题标题】:Swift - How to get index of Dictionary element from value?Swift - 如何从值中获取字典元素的索引?
【发布时间】:2018-11-13 03:40:34
【问题描述】:

我正在使用字典数组 (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

我想获取值为languageNamelanguageCode 的字典的索引。我浏览了其他答案,但没有找到任何好的解决方案。

源代码:https://github.com/imjog/susi_iOS/tree/voice

文件链接:https://github.com/imjog/susi_iOS/blob/voice/Susi/Controllers/LanguagePickerController/LanguagePickerController.swift

【问题讨论】:

    标签: ios swift dictionary swift4


    【解决方案1】:

    我有一个字典数组,其中字典的类型为&lt;String,Any&gt;

    经过一些研究和尝试,我找到了适合我的东西。

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

    PS - ($0 as AnyObject)["Title"] as?字符串是您要查找的文本..

    【讨论】:

      【解决方案2】:

      字典是键值对的

      如果你想从 value 中获取 Dictionary 元素的索引。
      您可以尝试使用如下元组数组:

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

      希望有用!

      【讨论】:

        【解决方案3】:

        正如其他人已经说过的那样,我没有看到使用字典数组作为表格视图模型的意义......但是,如果我理解你的问题,这有帮助吗? 问候

        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 :(")
        }
        

        【讨论】:

          【解决方案4】:

          我认为这里不需要使用字典。您可以简单地创建一个新类型 Language 并进行如下搜索。

          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")
          

          【讨论】:

          • 我真正的问题是我有一个 TableView。通过使用字典,我将单元格添加到表中(有问题)。我在 UserDefaults 中有一个表格单元格内容,它包含在 TableView 单元格中。我想获取包含我在 UserDefaults 中的值的那个单元格的 indexPath。
          • 您的评论令人困惑,如果您能详细说明,我可以提供帮助。而且我不知道你为什么首先使用字典,因为你的字典只包含一个键值对。
          • 对不起,它是字典数组。我更新了问题
          【解决方案5】:

          字典是无序的。他们没有索引。字典有键,它们是一些可散列的值。

          字典中的所有键都是唯一的,但并非所有值都是唯一的。

          你可以拥有一个[String:Int] 类型的字典,其中包含值

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

          在这种情况下,值 1 的键是什么?包含该值的任何键都可以吗?在这种情况下,您可以遍历键/值对,直到找到匹配的值并返回该键,但没有 first 匹配值之类的东西,因为如上所述,字典是无序的。

          【讨论】:

          • 我真正的问题是我有一个 TableView。通过使用字典,我将单元格添加到表中(有问题)。我在 UserDefaults 中有一个表格单元格内容,它包含在 TableView 单元格中。我想获取包含我在 UserDefaults 中的值的那个单元格的 indexPath。
          • A Dictionary 不能用作表视图的数据模型,因为字典是无序集合。您在几个方面感到困惑,需要回去研究基础知识。
          猜你喜欢
          • 2018-12-10
          • 2016-08-31
          • 2014-11-05
          • 2022-12-17
          • 2014-11-02
          • 1970-01-01
          • 2016-09-09
          • 2016-07-04
          • 1970-01-01
          相关资源
          最近更新 更多