Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在swift中为数组分配一段数字_Swift_Swift Array - Fatal编程技术网

如何在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])