2012-05-06 2 views
0

Есть ли способ сократить этот код?Сокращение кода для добавления переменной количества объектов в NSMutableArray

NSMutableArray *allobjects = [[NSMutableArray alloc] initWithCapacity:b]; 

    if (b == 1) { 
     [allobjects addObject:object]; 
    }else if (b == 2){ 
     [allobjects addObject:object]; 
     [allobjects addObject:object2]; 
    }else if (b == 3){ 

     [allobjects addObject:object]; 
     [allobjects addObject:object2]; 
     [allobjects addObject:object3]; 
    }else if (b == 4){ 

     [allobjects addObject:object]; 
     [allobjects addObject:object2]; 
     [allobjects addObject:object3]; 
     [allobjects addObject:object4]; 

    }else if (b == 5){ 

     [allobjects addObject:object]; 
     [allobjects addObject:object2]; 
     [allobjects addObject:object3]; 
     [allobjects addObject:object4]; 
     [allobjects addObject:object5]; 
    }else if (b == 6){ 

     [allobjects addObject:object]; 
     [allobjects addObject:object2]; 
     [allobjects addObject:object3]; 
     [allobjects addObject:object4]; 
     [allobjects addObject:object5]; 
     [allobjects addObject:object6]; 
    }else if (b == 7){ 

     [allobjects addObject:object]; 
     [allobjects addObject:object2]; 
     [allobjects addObject:object3]; 
     [allobjects addObject:object4]; 
     [allobjects addObject:object5]; 
     [allobjects addObject:object6]; 
     [allobjects addObject:object7]; 
    }else if (b == 8){ 

     [allobjects addObject:object]; 
     [allobjects addObject:object2]; 
     [allobjects addObject:object3]; 
     [allobjects addObject:object4]; 
     [allobjects addObject:object5]; 
     [allobjects addObject:object6]; 
     [allobjects addObject:object7]; 
     [allobjects addObject:object8]; 
    } 

Как вы можете видеть, если b равен 1 добавить object1, если b 2, я добавляю как object1 и object2, и так далее.

+0

Вам действительно нужно, чтобы узнать, как использовать массивы. Вместо назначения объекту N назначить элементу массива N. –

+0

Это изменение - это другой вопрос; пожалуйста, отправьте его отдельно. –

ответ

3

Поместите все эти строки в массив C:

NSString * objects[] = { object1, object2, object3, object4, object5, object6, object7, object8, object9 }; 

Затем перебирать, что как только вы знаете, какое значение b «s является:

allObjects = [NSMutableArray array]; 
for(int i = 0; i < b; i++){ 
    [allObjects addObject:objects[i]]; 
} 

Или, еще лучше, сделайте следующее:

allObjects = [NSMutableArray arrayWithObjects:objects count:b]; 
+1

Почему бы не создать его с помощью '[NSArray arrayWithObjects: count:]'? –

+0

Это действительно намного больше. –

+0

Почему бы просто не использовать исходный массив и ограничить значение индекса массива? –

1
NSString* ojbs[] = { object1, object2, object3, object4, object5, object6, object7, object8, object9 }; 

int _count = 5; // for example 

NSArray* arr = [NSArray arrayWithObjects: objs count: _count]; 
NSMutableArray* result = [NSMutableArray arrayWithCapacity: _count]; 
[resul addObjectsFromArray: arr]; 
+0

Вы можете просто создать 'result' напрямую. 'NSMutableArray * result = [NSMutableArray arrayWithObjects: objs count: b];' –

+0

True. MutableArray является прямым дочерним элементом массива ... – sha

1
NSArray *allStrings = [NSArray arrayWithObjects:object, object2, object3, object4, object5, object6, object7, object8, object9, nil]; 

NSArray *objects = nil; 
if (b <= [allStrings count]) 
    objects = [allStrings subarrayWithRange:NSMakeRange(0, b)]; 
1

Вот два альтернативных ответов:


1.

Что делать это динамически (! Если вы можете переименовать object в object0, чтобы соответствовать шаблону)

for (uint n = 0; n < b; ++n) { 
    NSString *name = [NSString stringWithFormat:@"object%i], n]; 
    [allObjects addObject:[self performSelector:name]]; 
} 

Однако это медленнее во время выполнения, чем другие ответы на основе массива (вы должны создавать новую строку каждый раз, когда их массивы могут быть сделаны в viewDidLoad).


2.

Другим способом было бы использовать tag свойство зрения - тогда ваш цикл стал бы что-то вроде:

for (uint n = 0; n < b; ++n) 
    [allObjects addObject:[self.view viewWithTag:n]]; 
1

Вздох!

switch (b) { 
    case 8 : 
     [allobjects insertObject:object8 atIndex:0]; 
    case 7 : 
     [allobjects insertObject:object7 atIndex:0]; 
    case 6 : 
     [allobjects insertObject:object6 atIndex:0]; 
    case 5 : 
     [allobjects insertObject:object5 atIndex:0]; 
    case 4 : 
     [allobjects insertObject:object4 atIndex:0]; 
    case 3 : 
     [allobjects insertObject:object3 atIndex:0]; 
    case 2 : 
     [allobjects insertObject:object2 atIndex:0]; 
    case 1 : 
     [allobjects insertObject:object atIndex:0]; 
     break; 
    default : 
     <Signal error or whatever> 
} 

Если записи не должны быть для того, вы можете просто использовать addObject.

Вы также можете использовать вариацию на оригинальном коде OP в:

if (b >= 1) [allobjects addObject:object]; 
if (b >= 2) [allobjects addObject:object2]; 
if (b >= 3) [allobjects addObject:object3]; 
if (b >= 4) [allobjects addObject:object4]; 
if (b >= 5) [allobjects addObject:object5]; 
if (b >= 6) [allobjects addObject:object6]; 
if (b >= 7) [allobjects addObject:object7]; 
if (b >= 8) [allobjects addObject:object8];