Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Swift, what's the cleanest way to get the last two items in an Array?

Is there a cleaner way to get the last two items of an array in Swift? In general, I try to avoid this approach since it's so easy to be off-by-one with the indexes. (Using Swift 1.2 for this example.)

// Swift -- slices are kind of a hassle? let oneArray = ["uno"] let twoArray = ["uno", "dos"] let threeArray = ["uno", "dos", "tres"]  func getLastTwo(array: [String]) -> [String] {     if array.count <= 1 {         return array     } else {         let slice: ArraySlice<String> = array[array.endIndex-2..<array.endIndex]         var lastTwo: Array<String> = Array(slice)         return lastTwo     } }  getLastTwo(oneArray)   // ["uno"] getLastTwo(twoArray)   // ["uno", "dos"] getLastTwo(threeArray) // ["dos", "tres"] 

I was hoping for something closer to Python's convenience.

## Python -- very convenient slices myList = ["uno", "dos", "tres"] print myList[-2:] # ["dos", "tres"] 
like image 585
zekel Avatar asked Jun 23 '15 15:06

zekel


People also ask

How do you get the last element of an array in Swift?

To get the last element of an array in Swift, access last property of this Array. Array. last returns the last element of this array. If the array is empty, then this property returns nil .

Which one is faster array or set in Swift?

Array is faster than set in terms of initialization. Set is slower than an array in terms of initialization because it uses a hash process. The array allows to store duplicate elements in it. Set doesn't allow to store duplicate elements in it.

What is .first in Swift?

Swift version: 5.6. The first() method exists on all sequences, and returns the first item in a sequence that passes a test you specify.


1 Answers

With Swift 5, according to your needs, you may choose one of the following patterns in order to get a new array from the last two elements of an array.


#1. Using Array's suffix(_:)

With Swift, objects that conform to Collection protocol have a suffix(_:) method. Array's suffix(_:) has the following declaration:

func suffix(_ maxLength: Int) -> ArraySlice<Element> 

Returns a subsequence, up to the given maximum length, containing the final elements of the collection.

Usage:

let array = [1, 2, 3, 4] let arraySlice = array.suffix(2) let newArray = Array(arraySlice) print(newArray) // prints: [3, 4] 

#2. Using Array's subscript(_:)

As an alternative to suffix(_:) method, you may use Array's subscript(_:) subscript:

let array = [1, 2, 3, 4] let range = array.index(array.endIndex, offsetBy: -2) ..< array.endIndex //let range = array.index(array.endIndex, offsetBy: -2)... // also works let arraySlice = array[range] let newArray = Array(arraySlice) print(newArray) // prints: [3, 4] 
like image 171
Imanou Petit Avatar answered Oct 11 '22 18:10

Imanou Petit