Java copyOfRange
также заполнит результирующий массив нулями, если верхнее значение диапазона больше длины массива. Эта функция также обрабатывает этот случай.
Эту функцию можно сделать общей. Это работает для любого типа, который соответствует ExpressibleByIntegerLiteral
, который необходим для заполнения 0
.
func copyOfRange<T>(arr: [T], from: Int, to: Int) -> [T]? where T: ExpressibleByIntegerLiteral {
guard from >= 0 && from <= arr.count && from <= to else { return nil }
var to = to
var padding = 0
if to > arr.count {
padding = to - arr.count
to = arr.count
}
return Array(arr[from..<to]) + [T](repeating: 0, count: padding)
}
Примеры:
let arr: [UInt8] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
if let result = copyOfRange(arr: arr, from: 0, to: 3) {
print(result) // [0, 1, 2]
}
if let result = copyOfRange(arr: arr, from: 7, to: 12) {
print(result) // [7, 8, 9, 0, 0]
}