3

xポイントという配列を保持するオブジェクトです。

x添字演算子を実装しているのでx[i]、配列の i 番目の要素 (T 型で、通常は Int または Double) を取得するなどのことができます。

これは私がやりたいことです:

 x[0...2] = [0...2]

ClosedInterval<T>しかし、Int/Double に変換できないというエラーが表示されます。

編集1:

ここに私のオブジェクトがあります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] を一気に更新する方法です。直感的に、私はやりたいと思いますx[0...2] = [0...2]。回答に見られるように、これは機能しません。私は(私の側では)反復せずに更新し、配列ではないxという事実を隠して(そうでなくても)更新したいと考えています。x

4

2 に答える 2

5

[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])
于 2015-02-03T17:58:27.180 に答える