№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]