配列を列挙したい場合(たとえば、要素のインデックスとその値を一緒に使用する必要があるmap()
関数の場合)、enumerate()
関数を使用できます。例:今元のインデックスを使用してスライスを列挙するには?
import Foundation
let array: [Double] = [1, 2, 3, 4]
let powersArray = array.enumerate().map() {
pow($0.element, Double($0.index))
}
print("array == \(array)")
print("powersArray == \(powersArray)")
// array == [1.0, 2.0, 3.0, 4.0]
// powersArray == [1.0, 2.0, 9.0, 64.0] <- As expected
私は配列からいくつかのサブシーケンスを使用したい場合は、私はslice
を使用することができ、私は元の配列で使用するように、私はちょうど同じインデックスを使用できるようになります(これは、私がループfor
の中でsubscript
アクセサーを使用する場合に、私が望むものです)。例えば:
let range = 1..<(array.count - 1)
let slice = array[range]
var powersSlice = [Double]()
for index in slice.indices {
powersSlice.append(pow(slice[index], Double(index)))
}
print("powersSlice == \(powersSlice)")
// powersSlice == [2.0, 9.0] <- As expected
しかし、私は、私は全く異なる動作を取得、私は元の配列で行ったようにenumerate().map()
アプローチを使用するようにしてください。代わりに、インデックスのslice
の範囲の私は、新しい、0ベースの範囲になるだろう:
let powersSliceEnumerate = slice.enumerate().map() {
pow($0.element, Double($0.index))
}
print("powersSliceEnumerate == \(powersSliceEnumerate)")
// powersSliceEnumerate == [1.0, 3.0] <- Not as expected
質問はまともな方法があるかどうかである(すなわち、オフセット、または何かを使用して手動で調整なし)を使用してスライスを列挙します独自のインデックスではなく、自動生成された0ベースのインデックスですか?
ないあなたの質問への答えが、あなたは、 '聞かせpowersSlice =スライスを持つforループを置き換えることができます.indices.map {pow(slice [$ 0]、Double($ 0))} ' –
ありがとう、@MartinR。私はあなたの提案を、 'enumerate'が生成したインデックス範囲をオフセットするだけではなく、回避策として念頭に置きます。 – courteouselk