Почему Dictionary.map возвращает массив кортежей и где это задокументировано?

Рассмотрим код ниже:

let dict = [
  "key1" : 1,
  "key2" : 2,
  "key3" : 3,
  "key4" : 4,
  "key5" : 5
]

let array = dict.map{$0}
for item in array {
  print(item)
}

Что вы получаете из операторов печати:

("key2", 2)
("key3", 3)
("key4", 4)
("key5", 5)
("key1", 1)

Пары ключ/значение из словаря преобразуются в кортежи. Я ожидал получить массив словарей с одним значением.

Почему оператор map преобразует мои элементы в кортежи и где задокументировано это поведение?

Преобразовать массив кортежей обратно в массив словарей очень просто, используя этот код:

let array = dict.map{[$0.0:$0.1]}

... но я пытаюсь понять, почему карта вообще дает мне кортежи.


person Duncan C    schedule 17.01.2017    source источник
comment
Не мой отрицательный голос, но я предполагаю, что это связано с отсутствием исследований. Я нашел ответ, нажав команду Dictionary и выполнив поиск iterator в модуле.   -  person JAL    schedule 17.01.2017
comment
Я в невыгодном положении, потому что не знаю, что искать для. Я потратил по крайней мере 1/2 часа, пытаясь понять это, и потерпел неудачу. Я не осознавал, что функция карты зависит от итератора словаря. Теперь, когда я это знаю, это имеет смысл, но я понятия не имел, что искать.   -  person Duncan C    schedule 17.01.2017
comment
¯\_(ツ)_/¯ Это переполнение стека, я отказался от вопросов, связанных с отрицательными голосами.   -  person JAL    schedule 17.01.2017
comment
Я не против того, чтобы меня проголосовали против, если мой вопрос или ответ каким-то образом отсутствуют - до тех пор, пока кто-то публикует конструктивную критику. Однако меня очень раздражают отрицательные голоса.   -  person Duncan C    schedule 17.01.2017


Ответы (1)


Это часть DictionaryIterator<Key, Value>. См. комментарий в модуле HashedCollections для makeIterator:

/// Returns an iterator over the dictionary's key-value pairs.
///
/// Iterating over a dictionary yields the key-value pairs as two-element
/// tuples. You can decompose the tuple in a `for`-`in` loop, which calls
/// `makeIterator()` behind the scenes, or when calling the iterator's
/// `next()` method directly.
///
///     let hues = ["Heliotrope": 296, "Coral": 16, "Aquamarine": 156]
///     for (name, hueValue) in hues {
///         print("The hue of \(name) is \(hueValue).")
///     }
///     // Prints "The hue of Heliotrope is 296."
///     // Prints "The hue of Coral is 16."
///     // Prints "The hue of Aquamarine is 156."
///
/// - Returns: An iterator over the dictionary with elements of type
///   `(key: Key, value: Value)`.
public func makeIterator() -> DictionaryIterator<Key, Value>
person JAL    schedule 17.01.2017
comment
Оооо, я узнал кое-что, чего не знал: у кортежа есть метки! for tuple in hues {print(tuple.key)} - person matt; 17.01.2017
comment
Еще полезно сделать так: for (key, object) in dict{print(key)}. - person MaddTheSane; 18.01.2017