6

I need to get last 10 elements or min of 10 and array.count. In objective-C I have done it like this :

Objective-C code :

NSRange endRange = NSMakeRange(sortedArray.count >= 10 ? sortedArray.count - 10 : 0, MIN(sortedArray.count, 10));
NSArray *lastElements= [sortedArray subarrayWithRange:endRange];

In Swift I have done this :

let endRange = NSMakeRange(values.count >= 10 ? values.count - 10 : 0, min(values.count , 10) )

But don't know how to get the array using this range in swift. Any help would be appreciated. Thanks.

Sharad Chauhan
  • 4,821
  • 2
  • 25
  • 50
  • Top Google hit for "swift last elements from array" – The Swift 2/3 code is for example in this answer https://stackoverflow.com/a/33279008/1187415 to the duplicate. – Martin R May 23 '17 at 07:19
  • let sortedArray:NSArray = [150,125,115,100,90,80,70,60,50,40,30,20,15]; let endRange = NSMakeRange(sortedArray.count >= 10 ? sortedArray.count - 10 : 0, min(sortedArray.count , 10) ) as NSRange let result = sortedArray.subarray(with: endRange) print("Results is: \(result)") – Tarun Seera May 23 '17 at 07:29

3 Answers3

13

You can use Array Instance Method suffix(_:). Note that using suffix you don't need to check your array count. It will take up to 10 elements from the end of your array.

let array = Array(1...100)   // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

let lastTenElements = Array(array.suffix(10))   // [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
Leo Dabus
  • 229,809
  • 59
  • 489
  • 571
1

You can get it by declaring Range:

let letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"]

let desiredRange = letters.index(letters.endIndex, offsetBy: -10) ..< letters.endIndex

// ["e", "f", "g", "h", "i", "j", "k", "l", "m", "n"]
let lastTenLetters = (desiredRange.count > letters.count) ? letters : Array(letters[desiredRange])

Note that if the desired range's count is more than the main array's count, the last ten elements should be the whole main array.

Although I still agree that Leo's answer is the proper one for your case, I would like to mention that the good thing about this solution is that it is applicable for not only last element, to make it clear, consider that you want to get 10 elements after the first one (referring to letters array, elements should be b-k), by implementing a desired range, you could achieve this, as follows:

let letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"]

let desiredRange = letters.index(letters.startIndex, offsetBy: 1) ..< letters.index(letters.startIndex, offsetBy: 11)

// ["b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
let lastTenLetters = (desiredRange.count > letters.count) ? letters : Array(letters[desiredRange])
Ahmad F
  • 30,560
  • 17
  • 97
  • 143
  • 3
    this would crash the app if the array has less then 10 elements – Leo Dabus May 23 '17 at 07:17
  • 1
    @LeoDabus you are right, I edited it... but I assume that in my code snippet it should be also applicable for not only last elements, please assist. Still think that for last elements case your answer is the proper one, I voted it up :) – Ahmad F May 23 '17 at 08:12
0

var values : NSArray = [1,2,3,4,5,6,7,8,9,10,11]

    values = values.reversed() as NSArray

    let tenDigits = values.prefix(10)

    debugPrint(values.count >= 10 ? NSArray(array: (Array(tenDigits))) : min(values.count , 10))