[0...2]
представляет собой массив с одним элементом, который, в лучшем случае, будет Range<Int>
от 0 до 2. Вы не можете назначить, что срез, содержащий, скажем, Int
с.
x[0...2]
С другой стороны, это (возможно) срез, а Sliceable
определяет только индекс get
, а не сеттер. Таким образом, даже если типы были более совместимы, то есть, если вы пробовали x[0...2] = 0...2
, который, по крайней мере, пытается заменить диапазон в пределах x
со значениями аналогичной коллекции - он все равно не сработает.
редактировать: в @rintaro указывает, массив поддерживает сеттер индекс для диапазонов - так что если x
были диапазон вы могли бы сделать x[0...2] = Slice(0...2)
- но он должен быть кусочек вы назначаете, так что я бы еще пойти с replaceRange
,
Если то, что вы имеете в виду вы хотите заменить 0 записей через 2 с некоторыми значениями, что вы хотите replaceRange
, до тех пор, как ваша коллекция соответствует RangeReplaceableCollection
(который, например, Array
делает):
var x = [0,1,2,3,4,5]
var y = [200,300,400]
x.replaceRange(2..<5, with: y)
// x is now [0,1,200,300,400,5]
Примечание. Заменяемый диапазон и y
не должны быть одинакового размера, коллекция будет расширяться/сокращаться по мере необходимости.
Кроме того, y
не имеет никакого массива, это может быть любая коллекция (должна быть коллекция, хотя и не последовательность).Таким образом, приведенный выше код может быть написан как:
var x = [0,1,2,3,4,5]
var y = lazy(2...4).map { $0 * 100 }
x.replaceRange(2..<5, with: y)
редактирования: так, за ваши изменения, чтобы в месте обнулить массив любого размера в один раз, вы можете сделать:
var x = [1.0,2.0,0.0]
// range to replace is the whole array's range,
// Repeat just generates any given value n times
x.replaceRange(indices(x), with: Repeat(count: x.count, repeatedValue: 0.0))
Соответственно отрегулируйте диапазон (и количество замещающих записей), если вы хотите просто выровнять поддиапазон.
Учитывая свой класс пример Point
, вот как вы могли бы реализовать такое поведение, предполагая, что это опирается на массив под капотом:
struct Point<T: FloatLiteralConvertible> {
private var _vals: [T]
init(dimensions: Int) {
_vals = Array(count: dimensions, repeatedValue: 0.0)
}
mutating func replaceRange
<C : CollectionType where C.Generator.Element == T>
(subRange: Range<Array<T>.Index>, with newElements: C) {
// just forwarding on the request - you could perhaps
// do some additional validation first to ensure dimensions
// aren't being altered...
_vals.replaceRange(subRange, with: newElements)
}
}
var x = Point<Double>(dimensions:3)
x.replaceRange(0...2, with: [1.1,2.2,3.3])
Пытались ли вы функцию карты, или вариант над ним? – holroy