У меня есть, казалось бы, легитимная функция, которая преобразует массив в словарь:Swift не может вывести тип из контекста
func arrayToDictionary<Key : Hashable, Value>
(source: Array<Value>, key: Value -> Key) -> Dictionary<Key, Value> {
var dictionary = Dictionary<Key, Value>()
for element in source {
let key = key(element)
dictionary[key] = element
}
return dictionary
}
Теперь, когда я пытаюсь назвать:
let dict = arrayToDictionary([1, 2, 3], { val in return val })
Я получаю ошибку - Невозможно преобразовать тип выражения '($ T6, (($ T9) -> ($ T9) -> $ T8) -> (($ T9) -> $ T8) -> $ T8)' для ввода типа "Hashable"
Странно, если я использую неявный доход:
let dict = arrayToDictionary([1, 2, 3], { val in val })
или сокращенная:
let dict = arrayToDictionary([1, 2, 3], { $0 })
это работает просто отлично. Зачем?
'пусть ДИКТ = arrayToDictionary ([1, 2, 3], {вала в вале})' (вынул ' возврат') тоже похоже все работает нормально. –
И даже незнакомец, явно определяющий 'val' как' Int' с 'return' на месте:' let dict = arrayToDictionary ([1, 2, 3], {(val: Int) в return val}) ' вызывает ошибку: «NSNumber» не является подтипом «Int''». Возвращение «возвращения» снова работает. –
это похоже на ошибку компилятора, и я рекомендую вам сообщить об этом. Некоторая оптимизация происходит за кулисами, сделанными слишком рано, и проверка типа не радует этого. –