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

3 ответов:

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

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]

С Swift 4, Когда вы пишете:

let newNumbers = numbers[0...position]

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

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

таким образом, вы можете использовать один из следующих четырех способы получения нового массива из первого n элементов массива.


#1. Используя Array Нижний индекс с диапазоном

можно использовать Array Нижний индекс с CountableRange,CountableClosedRange,PartialRangeUpTo или partialRangeThrough чтобы получить подпоследовательность первых элементов массива.

использование:

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

#2. Используя Array ' s prefix(_:) метод

Swift обеспечивает 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. Создание пользовательской глобальной функции

следующий код игровой площадки показывает ho для создания глобальной функции, которая возвращает первый n элементов Array:

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

let array = Array(10...14) // [10, 11, 12, 13, 14]
let newArray = aFunction(numbers: array, position: 3)
print(newArray) // prints [10, 11, 12]

#4. Создание Array пользовательский модуль метод

следующий код игровой площадки показывает ho для создания Array расширение пользовательского метода, который возвращает первый n элементы Array:

extension Array {

    func getFirstElements(upTo position: Int) -> Array<Element> {
        let arraySlice = self[0 ..< position]
        return Array(arraySlice)
    }

}

let array = Array(10...14) // [10, 11, 12, 13, 14]
let newArray = array.getFirstElements(upTo: 3)
print(newArray) // prints [10, 11, 12]
func subArray<T>(array: [T], range: NSRange) -> [T] {
  if range.location > array.count {
    return []
  }
  return Array(array[range.location..<min(range.length, array.count)])
}

Comments

    Ничего не найдено.