Изначально data
выглядит так:
"2019.5.3" : 3
"2019.5.5" : 4
"2019.5.7" : 3
Предположим, вы выполнили data.mapValues(f)
, где f
- функция, итоговый словарь будет выглядеть так:
"2019.5.3" : f(3)
"2019.5.5" : f(4)
"2019.5.7" : f(3)
Итак, теперь тип значения словаря меняется на возвращаемый тип f
, в то время как тип ключа остается неизменным.
какое именно значение colorIndex
передается в закрытие ?
Это каждое значение в data
. Каждое значение будет передано в закрытие один раз.
Чтобы увидеть это более четко, я написал один из возможных способов реализации mapValues
:
extension Dictionary {
func myMapValues<T>(_ transform: (Value) throws -> T) rethrows -> [Key: T] {
var retVal = [Key: T]()
for entry in self {
retVal[entry.key] = try transform(entry.value)
}
return retVal
}
}
Это из heatmap.plist?
Косвенно да. Содержимое локальной переменной data
([String: Int]
) изначально было из heatmap.plist
, но mapValues
работает непосредственно с data
, уже прочитанным из файла.
I ' m запутался, как String передается в data
, data[dateString]
из функции colorFor(dateComponents: )
, но colorIndex
это Int
.
colorIndex
здесь не имеет значения. colorIndex
- это просто имя параметра функции функции, которую вы передаете в mapValues
. На этом этапе был вызван mapValues
, и значения словаря были преобразованы.
Вы можете передать String
в data
, потому что словарь data
имеет String
s в качестве ключей. Напомним, что mapValues
не меняет тип ключа. Обратите внимание, что эта data
отличается от локальной переменной data
. Я говорю о свойстве lazy
data
типа [String: UIColor]
.