如何在swift中为数组分配一个数字片段

时间:2015-02-03 17:50:02

标签: swift swift-array

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不是数组的事实(即使它不是)。

2 个答案:

答案 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)来处理多个分配的情况。这不是自动完成的。