Новый массив из диапазона индексов 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)])
}