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