Swift: Словарь словарей, не может получить индекс - PullRequest
1 голос
/ 18 января 2020

Я смотрел на другие проблемы с индексами здесь, и я не думаю, что они соответствуют моей проблеме. У меня есть словарь словарей - Dictionary[String:Dictionary[String:String]]

В расширении я хочу l oop через все значения (Словарь [String: String] и получить одно из значений.

Поэтому я написал это:

for dictNEO in Array(self.values)  {
    print(dictNEO)
    print(type(of: dictNEO))
    print(dictNEO["approachDate"])
}

и получаю эту ошибку в последней строке печати: Value of type 'Value' has no subscripts

Вот первые две строки печати:

["nominalDist": "\"13.58 ", "approachDate": "\"2020-Feb-01 08:18 ± < 00:01\"", "minimumDist": "\"13.58 ", "diameter": "\"92 m -  210 m\"", "name": "\"(2017 AE5)\""]
Dictionary<String, String>

Поэтому я не понимаю, почему он говорит, что у него нет подписчиков, когда он видит тип словаря.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Вы написали это как расширение словаря, если я правильно вас понимаю, и это означает, что self является обобщенным c и определено как Dictionary<Key, Value>, а не для вас, указав тип c, как в вашем for l oop Вы перебираете массив [Value].

Поэтому вам нужно набрать Value, прежде чем обращаться к нему как к словарю

if let dictionary = dictNEO as? [String: String] {
    print(dictNEO["approachDate"])
}

, но так как это не имеет особого смысла чтобы иметь расширение Dictionary, где вы получаете доступ к указанному ключу c, было бы лучше написать его как функцию. Поскольку словарь теперь хорошо определен, проблем с последним print

func printValuesForSubKey(_ key: String,  _ dict: [String: [String: String]]) {
    for (dictNEO) in dict.values {
        print(dictNEO)
        print(type(of: dictNEO))
        print(dictNEO[key])        
    }
}

нет. Обратите внимание, у меня нет объяснения, почему type(of:) распознает его как [String: String]

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

Фрагмент кода не работает, потому что свойство values является коллекцией коллекций, а с Array(values) вы создаете коллекцию коллекций коллекций. Короче говоря, вместо того, чтобы идти вниз, код идет вверх и создает новый уровень сбора.

  • Решение с функцией высшего порядка map:

    self.values.map { print(type(of: $0)); $0["approachDate"] }
    
  • Решение с For-In L oop

    for dictNEO in self.values  {
        print(dictNEO)
        print(type(of: dictNEO))
        print(dictNEO["approachDate"])
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...