简化Objective-C代码以提高可读性
作为斯坦福大学iTunes U iOS编程课程的一部分,我编写了以下Objective-C代码。有没有办法简化这段代码?要求是,如果集合为空,而不是空NSSet,则此方法返回nil。它还需要采用(id),而不是NSArray,并且无论向该方法传递什么值,该方法都不会崩溃简化Objective-C代码以提高可读性,objective-c,refactoring,Objective C,Refactoring,作为斯坦福大学iTunes U iOS编程课程的一部分,我编写了以下Objective-C代码。有没有办法简化这段代码?要求是,如果集合为空,而不是空NSSet,则此方法返回nil。它还需要采用(id),而不是NSArray,并且无论向该方法传递什么值,该方法都不会崩溃 + (NSSet *)variablesUsedInProgram:(id)program { NSMutableArray *stack; id variables; NSMutableSet *set
+ (NSSet *)variablesUsedInProgram:(id)program {
NSMutableArray *stack;
id variables;
NSMutableSet *setOfVariables;
if ([program isKindOfClass:[NSArray class]]) {
stack = [program mutableCopy];
int i = stack.count;
while (i--) {
if ([[stack objectAtIndex:i] isKindOfClass:[NSString class]]) {
if ([self isOperation:[stack objectAtIndex:i]]) {
[setOfVariables addObject:[stack objectAtIndex:i]];
}
}
}
}
if (setOfVariables.count > 0) {
variables = setOfVariables;
}
return variables;
}
快速枚举应该在这种情况下起作用
+ (NSSet *)variablesUsedInProgram:(id)program {
NSMutableArray *stack;
id variables;
NSMutableSet *setOfVariables;
if ([program isKindOfClass:[NSArray class]]) {
stack = [program mutableCopy];
for (NSString *string in stack)//Fast enumerate through the array for NSString's
{
if ([self isOperation:string]) {
[setOfVariables addObject:string];
}
}
}
if (setOfVariables.count > 0) {
variables = setOfVariables;
}
return variables;
}
变量
和变量集
从未初始化。如果setOfVariables
(假设已初始化)的计数为0,则该方法将返回未初始化的值。我不知道为什么您需要程序的可变副本,因为您从不修改数组。我不知道你为什么需要它的副本,而且你实际上也没有发布它(如果你使用的是ARC或GC,这是可以的,但是如果你使用的是MRC,就不需要了)。这就是我重构它的方式,可观察到的行为不应该与您的方法不同
+ (NSSet *)variablesUsedInProgram:(id)program
{
if (![program isKindOfClass:[NSArray class]])
return nil;
NSMutableSet *setOfVariables = [NSMutableSet set];
foreach (id object in program)
if ([self isOperation:object])
[setOfVariables addObject:object];
if (setOfVariables.count > 0)
return setOfVariables;
else
return nil;
}
在我看来,这是一个相当简单的方法:
+ (NSSet *)variablesUsedInProgram:(id)program {
if (![program isKindOfClass:[NSArray class]])
return nil;
Class stringClass = [NSString class];
NSSet *setOfVariables =
[program objectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
return ([obj isKindOfClass:stringClass] && [self isOperation:obj]);
}];
return setOfVariables.count ? setOfVariables : nil;
}
这行得通吗setOfVariables
从不初始化。此外,如果您从未实际更改其内容(通过stack
),那么创建程序的可变副本有什么意义呢?在任何情况下,这仍然不会返回nil
,这是一个要求。我认为NSArray
没有objectsPassingTest:
,我认为这是一个NSSet
方法。