Swift2.2からSwift3に移行しており、NSMakeRangeを書き換える際にエラーが発生しました。
そのエラーは解消できているのですが、処理でどうしても腑に落ちない点があります。
Swift2.2
let data = "あいうえお"dataUsingEncoding(NSShiftJISStringEncoding)
let subData = data?.subdataWithRange(NSMakeRange(0, 10))
Swift3
let data = "あいうえお".data(using: String.Encoding.shiftJIS) // 10bytes
let subData = data?.subdata(in: 0 ..< 10)
この場合、NSMakeRange(0, 10)
なので0 ..< 11
にして、0〜10の範囲を取得できるだろうと思っていたらエラーが発生し、以下のログが出力されました。
Termination app due to uncaught exception NSRangeException, reason: -[_MSInlineData subdataWithRange:]: range {0, 11} exceeds data length 10
今までの記憶では
0 ..< 10
=> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
0 ... 10
=> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
と考えていました。
なのでエラーとなったのが理解できません。
for~in
では今までの記憶通りの動きをしてくれたので、このdata(using:)
の場合のみ違うということでしょうか?