Rewite для в 0 ... n цикла по карте - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть быстрый код, как показано ниже

var items: [Item] = []
for i in 0...20 {
    items.append( makeItem(atIndex: i) )
}

можно ли переписать выше, как

var items: [Item] = [0...20].map {
   makeItem(atIndex: i)
}

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Возможно, просто не заключайте диапазон в массив, поэтому используйте (0...20) вместо [0...20]

Вы можете даже передать имя функции, и вам не нужно будет создаватьзакрытие одним звонком.

let items = (0...20).map(makeItem)
0 голосов
/ 12 февраля 2019

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

extension Array where Element == ClosedRange<Int> {

    @discardableResult
    func map(_ f: @escaping(Int) -> Void) -> [Int]{

        var result : [Int] = []

        for i in 0 ..< self[0].count {
            result.append(i)
            f(i)
        }

        return result
    }
}

и назвать его так:

let items = [0...50].map {
    print($0) // current index
}

print(items)

Обратите внимание, что элементы будут [Int], это решаетваш вопрос до ваших правок, когда вы просто хотели написать for цикл, подобный этому:

[0...50].map {
    print($0) // current index
}
0 голосов
/ 12 февраля 2019

Синтаксис [0...20] Массив, содержащий единственный закрытый диапазон из Int, , а не массив Int (это то, что вы обычно хотите назвать map() on), так что вы действительно хотите:

let integers = [
    0, 1, 2, 3, 4, 5, 
    6, 7, 8, 9, 10, 11, 
    12, 13, 14, 15, 16, 
    17 ,18, 19, 20]

integers.map{
   // your code here
}

(Мой первоначальный ответ пропустил это различие, я исправил его сейчас. Смотрите другие ответы о том, как преобразовать диапазон в массивInt)


Оба будут выполнять блок в скобках 21 раз, по одному на каждое целое число в массиве.

Но в отличие от цикла forожидается, что функция map() будет возвращать массив некоторого типа, где каждый элемент получается путем преобразования каждого из элементов в исходном массиве (в этом случае целые числа 0 - 20) в экземпляр результирующего типа.Например:

let textRepresentations: [String] = integers.map {
    return "\($0)"
}

// Now textRepresentations contains "0", "1", etc.

Если ваша цель состоит в том, чтобы собрать массив из объектов, созданных на основе этих 21 целых чисел, map() даст вам более элегантное решение, чем вы.было бы сделано более «в стиле C», например:

var textRepresentations: [String] = []
for i in 0 ... 20 {
     textRepresentations.append("\(i)")
}

Но если вам нужно выполнить некоторую логику только один раз для каждого из этих целых чисел, в результате чего массив не останется, используя map() (и отбрасывание результата) будет выглядеть неловко и сбивать с толку людей, которые должны поддерживать этот код (включая ваше будущее Я).

Кроме того, более "Swifty" альтернативой циклу for ... in является foreach (что немного больше похоже на map(), минус возвращаемый массив):

integers.foreach {
    // (use $0 instead of i)
}

...or, more verbosely:

integers.foreach { (element) in
    // (use `element`, of course)
}
...