简化Objective-C代码以提高可读性

简化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

作为斯坦福大学iTunes U iOS编程课程的一部分,我编写了以下Objective-C代码。有没有办法简化这段代码?要求是,如果集合为空,而不是空NSSet,则此方法返回nil。它还需要采用(id),而不是NSArray,并且无论向该方法传递什么值,该方法都不会崩溃

+ (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
方法。