x 是一个包含一个名为point的数组的对象.
x实现下标运算符,这样你就可以做一些事情,比如x[i]得到数组的第i个元素(类型为T,通常是Int或Double).
这就是我想要做的:
x[0...2] = [0...2]
Run Code Online (Sandbox Code Playgroud)
但是我收到的错误ClosedInterval<T>是无法转换为Int/Double.
EDIT1:
这是我的对象x:
let x = Point<Double>(dimensions:3)
Run Code Online (Sandbox Code Playgroud)
对于踢腿和咯咯:定义x为[1.0,2.0,0.0]
我可以n通过获得第一个元素x[0...2].
我想知道的是如何一举更新x [0 ... 2]以保持[0.0,0.0.0.0].直觉上,我想做x[0...2] = [0...2].这在答案中可以看出不起作用.我想在x没有迭代的情况下更新(在我的最后)并隐藏x不是数组的事实(即使它不是).
[0...2]是一个包含一个元素的数组,最多只能是Range<Int>0到2.你不能将它分配给包含Ints 的切片.
x[0...2]另一方面,(可能)是一个切片,Sliceable只定义一个get下标,而不是一个setter.因此,即使类型更兼容 - 也就是说,如果您尝试过x[0...2] = 0...2,至少尝试x用类似大小的集合的值替换其中的范围- 它仍然不起作用.
编辑:正如@rintaro指出的那样,Array确实支持范围的setter下标 - 所以如果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]
Run Code Online (Sandbox Code Playgroud)
注意,更换的范围y并不一定是相同的大小,集合将根据需要扩展/收缩.
此外,y没有数组,它可以是任何类型的集合(必须是一个集合,但不是一个序列).所以上面的代码可以写成:
var x = [0,1,2,3,4,5]
var y = lazy(2...4).map { $0 * 100 }
x.replaceRange(2..<5, with: y)
Run Code Online (Sandbox Code Playgroud)
编辑:因此,根据您的编辑,就地将任何大小的数组归零,您可以执行以下操作:
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))
Run Code Online (Sandbox Code Playgroud)
如果您想将子范围归零,请相应地调整范围(以及替换条目的数量).
给出您的示例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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |