[0...2]
は、せいぜい 0 ~ 2 の 1 つの要素を持つ配列です。たとえば、 sRange<Int>
を含むスライスに割り当てることはできません。Int
x[0...2]
一方、(おそらく)スライスであり、セッターではなく添え字Sliceable
のみを定義します。get
したがって、型がより互換性があったとしても、つまりx[0...2] = 0...2
、少なくとも範囲内x
を同様のサイズのコレクションの値に置き換えようとしている を試した場合でも、機能しません。
編集: @rintaro が指摘しているように、Array は範囲のセッター添え字をサポートしてい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]
置き換えられた範囲と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
、フードの下の配列に支えられていると仮定して、この動作を実装する方法は次のとおりです。
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])