# 1. Использование Arrayиндекса с диапазоном
В Swift 5, когда вы пишете…
let newNumbers = numbers[0...position]
… newNumbersНе тип, Array<Int>а тип ArraySlice<Int>. Это потому , что Array«S subscript(_:)возвращаетArraySlice<Element> который, согласно Apple, представляет собой представление о хранилище некоторого большего массива.
Кроме того, Swift также предоставляет Arrayинициализатор, называемый, init(_:)который позволяет нам создать новый массив из sequence(включая ArraySlice).
Следовательно, вы можете использовать subscript(_:)with 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. Использование 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]