Новый массив из диапазона индексов Swift

Как я могу сделать что-то подобное? Возьмите первые n элементов из массива:

newNumbers = numbers[0..n]

В настоящее время появляется следующая ошибка:

error: could not find an overload for 'subscript' that accepts the supplied arguments

EDIT:

Вот функция, над которой я работаю.

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = numbers[0...position]
    return newNumbers
}

Ответ 1

Это работает для меня:

var test = [1, 2, 3]
var n = 2
var test2 = test[0..<n]

Ваша проблема может заключаться в том, как вы начинаете свой массив.

EDIT:

Чтобы исправить вашу функцию, вы должны указать Slice в массив:

func aFunction(numbers: Array<Int>, position: Int) -> Array<Int> {
    var newNumbers = Array(numbers[0..<position])
    return newNumbers
}

// test
aFunction([1, 2, 3], 2) // returns [1, 2]

Ответ 2

# 1. Использование индекса Array с диапазоном

С Swift 5, когда вы пишете...

let newNumbers = numbers[0...position]

newNumbers не имеет тип Array<Int> но имеет тип ArraySlice<Int>. Это потому, что subscript(_:​) Array subscript(_:​) ArraySlice<Element> возвращает ArraySlice<Element> который, по мнению Apple, представляет вид на хранилище некоторого большего массива.

Кроме того, Swift также предоставляет Array инициализатор с именем init(_:​) ArraySlice который позволяет нам создавать новый массив из sequence (включая ArraySlice).

Следовательно, вы можете использовать subscript(_:​) init(_:​) с init(_:​), чтобы получить новый массив из первых n элементов массива:

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array[0..<3] // using Range
//let arraySlice = array[0...2] // using ClosedRange also works
//let arraySlice = array[..<3] // using PartialRangeUpTo also works
//let arraySlice = array[...2] // using PartialRangeThrough also works
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]

# 2. Использование prefix(_:) Array prefix(_:)

Swift предоставляет prefix(_:) метод prefix(_:) для типов, которые соответствуют протоколу Collection (включая Array). prefix(_:) имеет следующее объявление:

func prefix(_ maxLength: Int) -> ArraySlice<Element>

Возвращает подпоследовательность длиной до maxLength, содержащую исходные элементы.

Apple также заявляет:

Если максимальная длина превышает количество элементов в коллекции, результат содержит все элементы в коллекции.

Поэтому в качестве альтернативы предыдущему примеру вы можете использовать следующий код для создания нового массива из первых элементов другого массива:

let array = Array(10...14) // [10, 11, 12, 13, 14]
let arraySlice = array.prefix(3)
let newArray = Array(arraySlice)
print(newArray) // prints [10, 11, 12]

Ответ 3

func subArray<T>(array: [T], range: NSRange) -> [T] {
  if range.location > array.count {
    return []
  }
  return Array(array[range.location..<min(range.length, array.count)])
}