iOS
Swift

Swiftの配列からOut of boundsせず安全に指定範囲を抜き出す

配列から指定範囲を抜き出すのは、こうする。
(実行環境、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))