patternMinor
Replacing Items in an NSMutableArray
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.