Строковый массив

Я пытаюсь присоединиться к элементам массива String через функцию сокращения. Пробовал немного, но я не могу понять, в чем проблема. Это то, что я считаю, должно делать трюк. Я также пробовал другие альтернативы, но учитывая огромное количество, я буду ждать ввода:

var genres = ["towel", "42"]
var jointGenres : String = genres.reduce(0, combine: { $0 + "," + $1 })

Ошибка:

..: 14:44: Невозможно вызвать '+' с помощью списка аргументов типа '(IntegerLiteralConvertible, объединить: (($ T6, ($ T6, $T7) → ($ T6, $T7) → $T5) → ($ T6, ($ T6, $T7) → $T5) → $T5, (($ T6, $T7) → ($ T6, $T7) → $T5, $T7) → (($ T6, $T7) → $T5, $T7) → $T5) → (($ T6, ($ T6, $T7) → $T5) → $T5, (($ T6, $T7) → $T5, $T7) → $T5) → $T5) '

Из моего понимания, $0 следует вывести как String, а $1, в сочетании с $0, также должно быть в виде String. Я не знаю, в чем дело с системой типов здесь. Любая идея?

Ответ 1

Ваше сокращение закрытия должно выглядеть примерно так:

var jointGenres : String = genres.reduce("", combine: { $0 == "" ? $1 : $0 + "," + $1 })

У этого есть "" вместо 0, как и у вас, и убедитесь, что в начале возвращаемого значения нет дополнительной запятой.

Исходный код не работал, потому что возвращаемый тип, представленный как U в documentation, изначально был 0 в вашем ответе, в то время как вы пытаетесь добавить Строка к нему. В вашем случае вы действительно хотите, чтобы и U, и T представляли строки вместо Ints.

Ответ 2

Cocoa уже имеет функцию для этого. Он омрачен необходимостью приведения к NSArray.

var genres = ["towel", "42"]
var joinGenres = (genres as NSArray).componentsJoinedByString(",")

К моему удивлению, эта функция также может применяться к массивам типов, отличных от String:

let ints = [1,5,9,15,29]
let listOfInts = (ints as NSArray).componentsJoinedByString(",")

Ответ 3

сокращение не является прямым решением здесь, так как для первого элемента требуется специальная обработка. Для этой цели лучше использовать метод объединения строк:

let strings = ["a", "b", "c"]
let joinedString = ",".join(strings)

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

let joinedStrings = strings[1..<strings.count].reduce(strings[0]) { $0 + "," + $1 }

Ответ 4

Проблема - ваш первый аргумент reduce. Это аккумулятор, это целочисленный литерал, и это то, что прошло как $0 при первом запуске блока. Вы запрашиваете функцию уменьшения, чтобы добавить к ней строку.

Вместо 0 в качестве аргумента аккумулятора вы должны передать "" пустую строку.

Это работает:

var genres = ["towel", "42"]
var jointGenres : String = genres.reduce("", combine: { $0 + "," + $1 })