2012-02-05 3 views
2

Я написал следующий код Objective-C как часть курса iTunes в Stanford для программирования на iOS. Есть ли способы упростить этот код? Требование состоит в том, что этот метод возвращает 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

+0

Кроме того, в чем смысл создания изменчивой копии «программы», если вы никогда не изменяете ее содержимое (через 'stack'). – UIAdam

ответ

1

variables и setOfVariables никогда не отформатирована. В случае, когда 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' в любом случае, что является одним из требований. –

1

Off верхней части моей головы, это довольно короткий способ сделать это:

+ (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

Смежные вопросы