2011-02-23 3 views
2

여러 객체가있는 배열이 있고 각 값에 90.0을 추가하고 싶습니다. 열거를 사용하여이 작업을 수행하려고합니다. 그러면 다음을 생성합니다.iPhone - 블록 열거 형

[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent 
    usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

    double aValue = [obj doubleValue];      
    aValue += 90.0; 
    obj = [NSNumber numberWithDouble:aValue]; 
}]; 

제 질문은 마지막 줄에 관한 것입니다. 개체 값을 얻고 90을 더한 다음 다시 저장해야합니다. 이것은 약간 이상한 것입니다. 왜냐하면 객체 수준에서 작업하기 때문에 세 번째 행에 객체에 업데이트 된 값을 다시 저장하는 올바른 구문이 있는지 확실하지 않았습니다. Xcode는 "obj"가 사용되지 않는다고 불평합니다. 왜냐하면 obj에 번호를 할당하려고한다고 생각하기 때문입니다. 그러나 나는 값을 저장하고 있습니다.

이 정보가 맞습니까?

답변

1

더 좋은 방법은 새로운 배열에 수정 된 값을 저장하는 것입니다 : 내가 너무 구문 오류를 용서하십시오, 직선이를 입력 한

NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:[myArray count]]; 
__block newArray; 
[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

double aValue = [obj doubleValue];      
aValue += 90.0; 
[newArray insertObject:[NSNumber numberWithDouble:aValue] atIndex:idx]; 
}]; 

참고. 당신이 현재 위치에서 작업을하고 싶었다 경우

+0

감사합니다! 그게 문제를 해결해야 해 !! – SpaceDog

2

obj은 참조 또는 포인터가 아니므로 실제로 다시 저장할 수 없습니다. NSArray은이 기능을 지원하지 않습니다. 할 수있는 일은 NSNumber를 저장하는 대신 NSNumber (NSNumber **)에 포인터를 저장하고 새로운 객체에 대한 참조를 업데이트하는 것입니다.

숫자를 일반 double[] 배열에도 저장하는 것도 효과가 있습니다.

+0

개체에 대해서만 열거 할 수 있습니다. double은 객체가 아닙니다. NSNumber입니다. –

+0

정규 열거 * 메시지를 통해 열거 할 수 있음을 의미하지는 않았지만 배열에있을 때 각 요소를 쉽게 업데이트 할 수 있다는 것을 의미했습니다. – yan

+0

myArray는 NSMutableArray입니다 ... – SpaceDog

0

, 당신은이를 사용할 수 있습니다

있는 NSMutableArray는 스레드가 안되어 있지만
[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ 
    double aValue = [obj doubleValue];      
    aValue += 90.0; 
    [myArray replaceObjectAtIndex:idx withObject:[NSNumber numberWithDouble:aValue]]; 
}]; 

, 즉 당신이 그것의 크기를 변경하는 경우에만 보통이다. 간단한 테스트에서 잘 작동하지만, 위험은 따로 둡니다.

+0

이전에 그랬지만 열거 된 배열을 변경할 수 없다는 오류가 발생했습니다. – SpaceDog