Почему я не могу вызвать Reduce (into :) для литерала массива в Xcode 9.2? - PullRequest
0 голосов
/ 18 мая 2018

Я искал способ сопоставить массив со словарем и нашел этот пост .Это было очень полезно.Я скопировал код из этого поста на игровую площадку, и он работает.

Затем я решил поиграть с ним больше:

[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:) не работает с литералами массива?

1 Ответ

0 голосов
/ 18 мая 2018

Это ошибка: SR-6995 Невозможно определить тип с помощью reduce(into:), который был исправлен в это время, ошибка больше не будет возникать с Xcode 9.3.1.

Интересно, что достаточно добавить любой дополнительный оператор в замыкание, чтобы он компилировался в Xcode 9.2:

let d = [1,2,3].reduce(into: [Int: String](), {
    () ; $0[$1] = $1.description
})

Другой вариант - явно указать тип аккумулятора в замыкании:

let d = [1,2,3].reduce(into: [Int: String](), { (accum: inout [Int: String], elem) in
    accum[elem] = elem.description
})

Или, как заметил @vacawama, явно аннотировать тип массива:

let d = ([1,2,3] as [Int]).reduce(into: [Int: String](), {
    $0[$1] = $1.description
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...