x
是一个包含一个名为point的数组的对象。
x
实现了下标运算符,因此您可以执行诸如x[i]
之类的操作来获取数组的第i个元素(类型为T,通常为Int或Double)。
这就是我想要做的事情:
x[0...2] = [0...2]
但是我收到一条错误消息,指出ClosedInterval<T>
无法转换为Int / Double。
EDIT1:
这是我的对象x
:
let x = Point<Double>(dimensions:3)
对于踢腿和傻笑:将x
定义为[1.0,2.0,0.0]
我可以通过n
获取第一个x[0...2]
元素。
我想知道的是如何一举更新x [0 ... 2]以保持[0.0,0.0.0.0]。直觉上,我想做{{ 1}}。这在答案中可以看出不起作用。我希望更新x[0...2] = [0...2]
而不进行迭代(在我的最后)并隐藏x
不是数组的事实(即使它不是)。
答案 0 :(得分:5)
[0...2]
是一个包含一个元素的数组,最多只能是从0到2的Range<Int>
。您无法将其分配给包含{{1}的切片}}第
Int
(可能)是一个切片,x[0...2]
只定义Sliceable
下标,而不是定位器。因此,即使类型更兼容 - 也就是说,如果您尝试get
,至少尝试使用类似大小的集合的值替换x[0...2] = 0...2
内的范围 - 它仍然不会&# 39;工作。
编辑:正如@rintaro指出的那样,Array确实支持范围的setter下标 - 所以如果x
是一个范围你可以做x
- 但它必须是你指定的切片,所以我仍然使用x[0...2] = Slice(0...2)
。
如果您的意思是想要将条目0到2替换为某些值,只要您的集合符合replaceRange
(例如,replaceRange
,您想要的就是RangeReplaceableCollection
。 1}}确实):
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
答案 1 :(得分:0)
您需要实现subscript(InvervalType)
来处理多个分配的情况。这不是自动完成的。