如何在swift中为数组分配一段数字
如何在swift中为数组分配一段数字,swift,swift-array,Swift,Swift Array,x是一个包含称为点的数组的对象 x实现了下标操作符,因此您可以执行类似于x[i]的操作来获取数组的第i个元素(类型为T,通常为Int或Double) 这就是我想做的: x[0...2] = [0...2] 但是我得到一个错误,它说ClosedInterval不能转换为Int/Double 编辑1: 这是我的对象x: let x = Point<Double>(dimensions:3) 设x=点(尺寸:3) 对于踢腿和咯咯笑:将x定义为[1.0,2.0,0.0] 我可以通过x
x
是一个包含称为点的数组的对象
x
实现了下标操作符,因此您可以执行类似于x[i]
的操作来获取数组的第i个元素(类型为T,通常为Int或Double)
这就是我想做的:
x[0...2] = [0...2]
但是我得到一个错误,它说ClosedInterval
不能转换为Int/Double
编辑1:
这是我的对象x
:
let x = Point<Double>(dimensions:3)
设x=点(尺寸:3)
对于踢腿和咯咯笑:将x
定义为[1.0,2.0,0.0]
我可以通过x[0…2]
获取第一个n
元素
我想知道的是如何更新x[0…2],使其能够一下子保持[0.0,0.0.0.0]。直观地说,我想做
x[0…2]=[0…2]
。从答案中可以看出,这是行不通的。我想不迭代地更新x
(在我这边),并隐藏x
不是数组的事实(即使它不是数组)。您需要实现下标(InvervalType)
来处理这样的多个赋值情况。这不是自动完成的。[0…2]
是一个包含一个元素的数组,充其量只能是0到2的范围。不能将其分配给包含(比如)Int
s的片
另一方面,x[0…2]
可能是一个切片,而Sliceable
只定义一个get
下标,而不是setter。因此,即使这些类型更加兼容—也就是说,如果您尝试使用大小类似的集合的值替换x[0…2]=0…2
,这至少是在尝试将x
中的某个范围—它仍然不起作用
编辑:正如@rintaro所指出的,数组确实支持范围的setter下标–因此,如果x
是一个范围,您可以执行x[0…2]=Slice(0…2)
–但它必须是您指定的一个片段,所以我仍然选择replaceRange
如果您的意思是希望用一些值替换条目0到2,那么您需要的是replaceRange
,只要您的集合符合RangeReplaceableCollection
(例如,Array
):
编辑:因此,根据您的编辑,要一次性将任意大小的数组归零,您可以执行以下操作:
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])
结构点{
私有变量[T]
初始(维度:Int){
_VAL=数组(计数:维度,重复值:0.0)
}
变异函数替换范围
(子范围:范围,带新元素:C){
//只是转发请求-你也许可以
//首先进行一些额外的验证以确保尺寸
//没有被改变。。。
_vals.replaceRange(子范围,带:新元素)
}
}
变量x=点(尺寸:3)
x、 替换范围(0…2,带:[1.1,2.2,3.3])
x不是数组。我希望把它当作一个(一个n点)。它包含一个数组。当然可以,但您仍然需要相当于replaceRange
-您可以将实现转发到包含的对象。@AirspeedVelocity FWIW,array
实现切片的setter。在上一个示例中,\u vals[subRange]=Slice(newElements)
应该可以工作。有趣的是,它确实可以工作,尽管它的行为似乎不一样–如果目标范围太小,数组切片设置器似乎用替换值替换后续值,即使它们不在提供的下标范围内。您能说得更多吗?我在谷歌上搜索了下标(InvervalType),但什么也没找到。你有没有试过地图功能,或者是它的变体?
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))
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])