Я искал способ сопоставить массив со словарем и нашел этот пост .Это было очень полезно.Я скопировал код из этого поста на игровую площадку, и он работает.
Затем я решил поиграть с ним больше:
[1,2,3].reduce(into: [Int: String](), {$0[$1] = $1.description})
Я ожидал, что он вернет [1: "1", 2: "2", 3: "3"]
, но компиляторвозникает ошибка:
Невозможно указать значение неправильного или неоднозначного типа
Вместо этого я попытался преобразовать в массив:
[1,2,3].reduce(into: [Int](), {$0.append($1)}) // I am aware that this is pointless
Но этовсе еще не компилируется.На этот раз сообщение будет другим:
Тип выражения неоднозначен без дополнительного контекста
Тогда я обнаружил, что это из-за того, что я использую литералы массива, потому что если я сначала объявил константный массив, а затем вызову reduce
, ошибок не будет:
let arr = [1,2,3]
arr.reduce(into: [Int: String](), {$0[$1] = $1.description})
Нормальный reduce
, кажется, работает нормально с литералами:
[1,2,3].reduce(0, +)
Почему reduce(into:)
не работает с литералами массива?