Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the last object of an NSArray

So I have an array which the amount of items could vary. I was wondering if there is anyway I can get the last object of an NSArray? I did think of having like an int counter to trace the amount of items in the array however that seems too much of a hassle.

Does anyone know anyway that's better than this?

like image 231
TheAmateurProgrammer Avatar asked Aug 24 '11 12:08

TheAmateurProgrammer


People also ask

Can NSArray contain nil?

arrays can't contain nil. There is a special object, NSNull ( [NSNull null] ), that serves as a placeholder for nil.

How do you reverse an NSArray?

You can reverse a NSArray by writing your own loop iterating from the end towards the beginning and using a second array to add the items in reverse order. Or you can simply use - (NSEnumerator *)reverseObjectEnumerator from the NSArray class.

What is NSArray Objective-C?

An object representing a static ordered collection, for use instead of an Array constant in cases that require reference semantics.

Is NSArray ordered?

In Objective-C, arrays take the form of the NSArray class. An NSArray represents an ordered collection of objects. This distinction of being an ordered collection is what makes NSArray the go-to class that it is.


2 Answers

Expanding a bit on the question, there are several situations in which one could need the last object of an array, with different ways to obtain it.

In a straight Cocoa program

If one just wants to get the object in course of a standard Cocoa program, then this will do it:

[myArray lastObject] 

To address the concern of the counter - no need to implement one's own, either:

NSUInteger myCount = [myArray count]; 

Using key-value coding (KVC)

In case one needs to access the last object of an array through KVC, the story requires a bit of explanation.

First, requesting the value of a normal key from an array will create a new array consisting of the values of that key for each of the objects in the array. In other words, a request for the key lastObject from an array will make the array send valueForKey: to each of the objects using the key lastObject on them. Apart from not being the intended result, it will also likely throw an exception.

So in case one really needs to send a key to the array itself (as opposed to its contents), the key needs to be prepended with an @-sign. This tells the array that the key is intended for the array itself, and not its contents.

The key therefore has to have the form @lastObject, and be used like this:

NSArray *arr = @[@1, @2, @3];  NSNumber *number = [arr valueForKey: @"@lastObject"]; 

In a sort descriptor

An example of how this key could be used in a real program is a situation where an array of arrays needs to be sorted by the last object in each of the inner arrays.

The above key is simply used in the sort descriptor:

NSArray *arrayOfArrays = @[@[@5, @7, @8], @[@2, @3, @4, @6], @[@2, @5]];  NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: @"@lastObject" ascending: YES];  NSArray *sorted = [arrayOfArrays sortedArrayUsingDescriptors: @[sd]]; 

In a predicate

Likewise, in order to filter an array of arrays, the key can be used directly in a predicate:

NSPredicate *pred = [NSPredicate predicateWithFormat: @"self.@lastObject > 5"];  NSArray *filtered = [arrayOfArrays filteredArrayUsingPredicate: pred]; 

People preferring to leave the self-part out can simply use the format @"@lastObject > 5"

like image 92
Monolo Avatar answered Sep 20 '22 08:09

Monolo


[yourArray lastObject]; 

see the documentation

like image 20
Krishnabhadra Avatar answered Sep 22 '22 08:09

Krishnabhadra