38

This might be a basic question, but I can't seem to find an answer.

Suppose I have an NSArray (carArray) with objects of a certain type (Car).

Is it possible to get an NSArray (colorArray) with all values of a property (color) of these objects without iterating carArray with a for loop? (cfr. LINQ in .NET)

NSMutableArray *colorList = [[NSMutableArray alloc] initWithCapacity:0];

for (Car *car in carArray)
{
    [colorList addObject:car.color];
}

Thanks in advance.

3 Answers 3

83

Yes. Assuming that your object is adopting the KVC/KVO protocol. You can get an array of the properties like:

NSArray *colorList = [carArray valueForKey:@"color"];

Actually, what valueForKey: method does, is to return an array containing the results of invoking valueForKey: using key on each of the array's objects. (From Apple's Documentation on NSArray)

Sign up to request clarification or add additional context in comments.

2 Comments

I was looking at this method in the docs, but it wasn't very clear to me what is exactly did. I could just have tried it, of course.
Beware that using wrong key will result in a crash at runtime. This approach has no type safety so you won't be warned by the compiler for using the wrong key.
16

Yes. You can do that without iterating it.

NSArray *colorArray = [carArray valueForKeyPath:@"@distinctUnionOfObjects.color"];

Comments

-1

You can use the NSSet to get the colours:

NSSet *NScolors = [NSSet setWithArray:[carArray valueForKey:@"color"]];
NSArray *colors = [NScolors allObjects];

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.