С Swift логической точки зрения, это будет каждый раз, но при этом, есть некоторые обстоятельства, когда оптимизатор может превратить весь расчет в константу, и в этом случае это не имеет значения.
Есть две вещи, стоящие на пути: массив palette
и собственность photos.count
. Теоретически массив palette
никогда не изменяется, но компилятор не может этого знать, потому что он не знает, что такая функция, как redColor()
, всегда возвращает то же значение. Поэтому поднимите это создание массива из свойства.
photos.count
, возможно, нет фиксации, при условии, что photos
динамически изменяется в процессе выполнения программы.
Но это даст вам тот же эффект и не требует создания каких-либо массивов на всех:
struct PaletteCycler {
let palette = [
UIColor.redColor(), UIColor.greenColor(),
UIColor.blueColor(), UIColor.orangeColor(),
UIColor.purpleColor(), UIColor.yellowColor(),
]
subscript(idx: Int)->UIColor {
return palette[idx%palette.count]
}
}
let colors = PaletteCycler()
Поскольку все постоянно существует очень мало затрат времени выполнения для извлечения цвета. В отличие от исходной версии, это не создает массив каждый раз. Поскольку mod и fetch довольно эффективны, а переменная palette
постоянна, она должна быть быстрой.
Кстати, если что-то не так постоянны и вы действительно хотите массив, вы можете переписать цикл, используя карту следующим образом:
let palette = [
UIColor.redColor(), UIColor.greenColor(),
UIColor.blueColor(), UIColor.orangeColor(),
UIColor.purpleColor(), UIColor.yellowColor(),
]
var colors: [UIColor] = {
// Swift 2.0 syntax. For 1.2, write
// indices(photos).map
return photos.indices.map {
palette[$0 % palette.count]
}
}
я уверен, что ответы на большинство вопросов, задаваемых на стеки в книге где-то чувак. –
Да, вы правы, но я имею в виду, что значение не хранится в памяти в книге. Таким образом, кеш @robdashnash – dopcn