配列から指定範囲を抜き出すのは、こうする。
(実行環境、Xcode 9.3 + Swift 4.1)
// let array = [1, 2, 3]でも同じ。わかりやすく明示的型指定。
let array: [Int] = [1, 2, 3]
// [0, 1, 2]
print(array[0...2])
// Array<Int>ではなくArraySlice<Int>型である
print(type(of: array1[0...2]))
// 範囲外指定するとOut of boundsでクラッシュ
print(array[0...3])
Out of boundsでクラッシュするのも、Arrayでないのも引数に渡すときなど不便。
そこで拡張メソッドを作る。
extension Array where Element: Any {
func safeSlice(start: Int, length: Int) -> Array {
if self.count == 0 || length == 0 {
return []
}
if start + length > self.count {
return Array(self[start...(self.endIndex - 1)])
} else {
return Array(self[start...(start + length - 1)])
}
}
}
実行結果
let array = [1, 2, 3]
// []
print(array.st_safeSlice(start: 0, length: 0))
// [1]
print(array.st_safeSlice(start: 0, length: 1))
// [2, 3]
print(array.st_safeSlice(start: 1, length: 2))
// [1, 2, 3]
print(array.st_safeSlice(start: 0, length: 3))
// [2, 3]
print(array.st_safeSlice(start: 1, length: 2))
// [1, 2, 3]
// Out of boundsでクラッシュしない
print(array.st_safeSlice(start: 0, length: 4))
// [2, 3]
print(array.st_safeSlice(start: 1))