HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Replacing Items in an NSMutableArray

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
nsmutablearrayitemsreplacing

Problem

I have a function which is supposed to replace all instances of variables (represented as NSStrings) from an NSDictionary with their corresponding values before calling another procedure. I ended up doing this with a simple for loop, though I suspect that there is a better way. Do you have a suggestion how to do this differently?

+ (double)runProgram:(id)program usingVariables:(NSDictionary *)variables {        
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {
        stack = [program mutableCopy];
        for (int i=0; i<stack.count; i++) {
            /* replace variable values with NSNumber values */
            NSNumber *variableValue = [variables valueForKey:[stack objectAtIndex:i]];
            if ([variableValue isKindOfClass:[NSNumber class]]) {
                [stack replaceObjectAtIndex:i withObject:variableValue];
            }
            /* all variables should be replaced now */
        }
    }
    return [self popOperandOffProgramStack:stack];
}

Solution

+ (double)runProgram:(id)program usingVariables:(NSDictionary *)variables {        
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {


Checking the type of incoming parameters is a little suspicious. Do you really want to allow other parameters and just ignore them?

stack = [program mutableCopy];


This process would actually be easier if you didn't create a copy, but instead create an empty NSMutableArray and add the filtered objects to it.

for (int i=0; i<stack.count; i++) {


Presumably, you are using this because you need the indexes to replace the objects. If you stop making a copy, you should be able to replace this a foreach loop over the program.

/* replace variable values with NSNumber values */
            NSNumber *variableValue = [variables valueForKey:[stack objectAtIndex:i]];
            if ([variableValue isKindOfClass:[NSNumber class]]) {


Again why are you checking types? Are there other things besides numbers in your variables? If there are, do you just want to ignore them?

[stack replaceObjectAtIndex:i withObject:variableValue];
            }
            /* all variables should be replaced now */


This comment isn't true here, because its on the wrong side of the brace

}
    }
    return [self popOperandOffProgramStack:stack];
}

Code Snippets

+ (double)runProgram:(id)program usingVariables:(NSDictionary *)variables {        
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {
stack = [program mutableCopy];
for (int i=0; i<stack.count; i++) {
/* replace variable values with NSNumber values */
            NSNumber *variableValue = [variables valueForKey:[stack objectAtIndex:i]];
            if ([variableValue isKindOfClass:[NSNumber class]]) {
[stack replaceObjectAtIndex:i withObject:variableValue];
            }
            /* all variables should be replaced now */

Context

StackExchange Code Review Q#8659, answer score: 6

Revisions (0)

No revisions yet.