はじめに
配列の一部をスライスした配列に対して再度スライスする際の挙動が Swift 2.0 で変わっていたのでメモ
Swift 2.0 の ArraySlice
ではインデックスがオリジナルのインデックスのままのため、更にスライスしようとすると範囲外アクセスになりエラーとなる模様
Swift 1.2 での動作
let arr = [1, 2, 3, 4, 5]
let sliced = arr[2..<4]
// [3, 4]
sliced[0..<1]
// [3]
Swift 2.0 での動作
let arr = [1, 2, 3, 4, 5]
let sliced = arr[2..<4]
// [3, 4]
sliced[0..<1] // fatal error: Negative ArraySlice index is out of range
-
[_, _, 3, 4, _]
- 初回スライス時
-
sliced[0..<1]
- 二回目のスライスを行う
-
[x, _, 3, 4, _]
-
0..<1
は範囲外!
-
対応方法
一旦 Array にしてしまう、以上
let arr = [1, 2, 3, 4, 5]
let sliced = Array(arr[2..<4])
// [3, 4]
sliced[0..<1]
// [3]