2012-02-05 62 views
2

我在Objective-C代碼中編寫了這段代碼,作爲斯坦福大學iOS編程的iTunes U課程的一部分。有什麼方法可以簡化這段代碼嗎?要求是這個方法返回nil,如果這個集合是空的,而不是空的NSSet。它也需要一個(id),而不是一個NSArray,並且該方法不會崩潰,無論傳入的值是什麼。簡化Objective-C代碼以提高可讀性

+ (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; 
} 
+2

這是否甚至工作? 'setOfVariables'永遠不會被初始化。 – Costique 2012-02-05 07:22:02

+0

另外,如果你從來沒有真正改變它的內容(通過'stack'),那麼創建'program'的可變拷貝有什麼意義。 – UIAdam 2012-02-05 07:41:16

回答

1

variablessetOfVariables從不初始化。在setOfVariables(假設它初始化)的計數爲0的情況下,該方法將返回未初始化的值。我不確定爲什麼你需要一個program的可變副本,因爲你從不修改數組。我不確定爲什麼你實際上需要它的一個副本,而且你也不實際釋放它(如果你正在使用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; 
} 
0

快速枚舉應該在這種情況下工作。


+ (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; 
} 
+0

在任何情況下,這仍然不會返回'nil',這是要求之一。 – 2012-02-05 08:28:43

1

關閉我的頭頂,這是一個相當短的方式來做到這一點:

+ (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; 
} 
+0

我以爲'NSArray'沒有'objectsPassingTest:',我認爲這是'NSSet'方法。 – dreamlax 2012-02-06 00:26:41