2013-08-09 3 views
-1

실제로 어떤 변수인지 알지 못하도록 NSMutableArray에 넣은 항목의 값을 변경해야합니다. 그게 가능하니? C에서는 포인터를 사용하여이 작업을 수행 할 수 있다고 생각합니다.ObjectiveC 콜렉션의 C 스타일 포인터

int i = 0; 
int *j = &i; 
*j = 5; 
NSLog (@"'%d'",i); // Prints '5' 

어떻게 이것을 Objective C로 변환합니까? 그래서 내가 NSMutableArray를 넣어 2 NSStrings이있는 경우 :

NSString *text1 = @"Hello"; 
NSMutableString *text2 = @"World"; 
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:text1,text2,nil]; 

그리고 언젠가 나중에

[arr objectAtIndex:1] = @"Everyone"; 
NSLog (@"'%@'",text2); // I want this to print 'Everyone' 

어떻게 이런 짓을 했을까? 이 구문은 마지막 코드 블록의 첫 번째 줄에 Expression is not assignable 오류를 제공합니다.

내가 조금 더 첫 번째 코드 블록에서 C 코드처럼 보이는이를 변경하는 경우 : 나는 첫 번째 줄에 아크 오류 Implicit conversion of an indirect pointer to an Objective-C pointer to 'id' is disallowed with ARC를 얻을 수

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:&text1,&text2,nil]; 

*[arr objectAtIndex:1] = @"Everyone" 

Assigning to 'id' from incompatible type 'NSString *' 두 번째 줄에 나는 이것에 약간의 다른 약간의 조정을 시도했지만, 그들 모두는 약간의 오류를 던진다.

분명히 나는이 일을하지 않고 있지만 아이디어가 부족합니다.

편집 : 그것은 내가 새 문자열을 만들고 내가 전에 색인 1에서 가지고 있던 문자열을 대체하려는 것 같아요. 그게 내가하려는 일이 아니야. 나는 기본적으로 변수의 이름을 사용하지 않고 변수의 값을 변경하기 위해 배열을 사용하려고한다. (실제 프로젝트에서는 변경할 필요가있을 때 그 이름이 무엇인지 모른다.)

+0

음, 프로그래밍에 대해 어떻게 질문하지 않습니까? – GeneralMike

+0

"최소 이해". 없는. –

답변

1

목표 C 문자열은 불변이기 때문에 당신이 다른 텍스트가 표시되지 않는 이유는, 실제로 배열에 다음과 같이 새 객체를 삽입했습니다. [arr objectAtIndex : 1] = @ "Everyone";

예를 들어 NSMutableString을 대신 사용하여 배열에서 검색하고 setString을 호출하여 원하는 것을 얻을 수 있습니다.

일반적인 경우 NSArray에 객체를 삽입하는 경우 객체를 수정하면 다른 모든 참조에도 반영됩니다.

+0

mg, 너무 많은 데르 프. 실제로 당신이 언급 한 이유에 대해'NSMutableString'으로'text2'를 선언했지만, 그 대신 ('@ @ "Everyone"대신) 값을 변경하기 위해'setString'을 호출해야한다는 것을 잊었습니다. 나는 당신이 어딘가에 마지막 문장에서 당신이 가진 것을 보았다고 생각했는데, 이것이 작동하지 않을 때 나는 그렇지 않다고 생각했고, 그것을하기위한 또 다른 방법을 찾아보기 시작했다. , 잘못된 구문을 사용하여 새로운 값을 할당하고있었습니다. 나는 그것을 놓쳤다 고 믿을 수 없어, 정말 고마워. – GeneralMike

0

Objective-C와 같은 모든 객체 지향 프로그래밍 언어에서 우리는 정확히 그 목적을 위해 객체를 사용합니다.

그래서 올바른 길을 가고 있습니다. NSArray 또는 NSMutableArray를 사용하면 모든 유형의 객체를 수집하고 색인으로 액세스 할 수 있습니다.

당신의

[arr objectAtIndex:1] = @"Everyone"; 

정말 배열 인덱스 0 에서 시작 arr이에 대한 유형 NSMutabelArray이어야 염두에

같은
[arr addObject:@"Everyone"]; // That would add it to the end or 

[arr insertObject:@"Everyone" atIndex:1]; // that would insert it at index 1. 

베어 보인다.

현대 Ojective-C 컴파일러는

두 번째 질문을 다시
NSLog (@"index %d of the array: %@", 1, arr[1]); 

로 바로 가기를 제공합니다

NSArray *arr = [NSArray arrayWithObject:@"me", @"everybody else", nil]; //now goes as 
NSArray *arr = @[@"me", @"everybody else"]; 
+0

'NSMutableArray' 부분을 잘 살펴 보았습니다.하지만 제가 잘 해내 고자하는 것을 설명하지 않았다고 생각합니다. 배열에서 참조하고있는 객체를 대체하고 싶지는 않습니다. 동일한 객체를 참조하고 싶지만 값을 다른 것으로 변경하십시오. 말이 돼? 나는 내 목표를 더 잘 설명하려고 OP를 편집했다. – GeneralMike

+0

@GeneralMike'exchangeObjectAtIndex : withObject :'또는 원시 포인터를 추가 할 수있는 커스텀'CFArray'를 찾은 다음'* CFArrayGetValueAtIndex (arr, idx) = foo'를 할 수 있습니다. –