2013-04-22 6 views
0

C++에서 처음으로 Objective C를 프로그래밍하고 있습니다 (지금까지 후자가 훨씬 낫습니다!). 내가 변경할 수있는 배열에 관한 질문이 있는데, 즉 제네릭 ID 유형 대신 'CMParticle'이라는 내 객체 중 하나의 특정 유형으로 객체를 만들고 싶습니다. 내 변경 가능한 배열에서 내 개체의 데이터에 액세스하려면, 정말 좋아 (I 성가신 생각입니다) 내 개체 중 하나로마다 캐스팅해야합니다 :가변 배열 객체 유형

'입자'CMParticle 내 변경 가능한 배열입니다
rij[0] = ((CMParticle *)particles[*pi]).crds[0] - ((CMParticle *)particles[*pj]).crds[0]; 

사물.

particles = [NSMutableArray array]; 

어떻게 든 내가없는 내 타입이 배열을 선언 할 수 있다면 그것은 좋은 것입니다 : 차라리이이

rij[0] = particles[*pi].crds[0] - particles[*pj].crds[0]; 

전에 내가 그렇게처럼 내 가변 배열을 선언 할 것 매번 타입 변환. 이것을 할 수있는 방법이 있습니까?

+1

봐 : http://stackoverflow.com/questions/5197446/nsmutablearray-force-the-array-는 각 배열에 대한 사용자 정의 클래스를 작성하는 것입니다 주변의 유일한 방법 to-hold-specific-object-type-only –

+0

아니요.이 일에 익숙해 져야합니다. –

답변

1

당신이 실제로 목적 C.에 이해가되지 않습니다 뭘 하려는지

C++ 용기는 균일하지만, 일반적이다. vector<CMParticle> 또는 vector<int>을 가질 수 있으며 다른 유형입니다.

ObjC 컨테이너는 이기종입니다. NSArray 만 있고 CMParticle 개의 개체, NSNumber 개의 개체 또는 다른 모든 개체가 하나의 큰 배열로 섞여있을 수 있습니다.

일반적으로 이러한 캐스트가 전혀 필요하지 않습니다. 메시지를 my_array[3]으로 보내려면 [my_array[3] doSomething:15]으로하십시오. 상위 레벨 언어 (Python, Ruby, Smalltalk, Javascript 등)와 같습니다.

유일한 문제는 (파이썬 등과 달리) 을 수행하는 경우가 있고에 캐스트가 필요한 경우가 있습니다. 비판적으로 (그리고 성가신) 회원들에게 직접 접근하고 싶다면 먼저 캐스트해야합니다. 이것은 ObjC (파이썬과 달리)가 멤버에게 직접 액세스하는 대신 @property 및/또는 명시 적 접근자를 사용하도록 권장하는 이유 중 하나입니다. 또한 변수가 타입을 선언했기 때문에 CMParticle *tempval = my_array[3]과 같은 유형을 지정해야합니다.

또 다른 방법은 다음과 같습니다. C++는 C의 정적 , 약한 타입 시스템은 당신에게 더 강력한 정적 타입 시스템을 제공합니다; 대신 ObjC는 동적 시스템 인 유형 시스템을 사용합니다 (불행히도 기존 C 항목을 변경하지 않고 그대로 두는 경우가 있습니다).

당신은 자신의 NSMutableArray 서브 클래스를 매우 쉽게 작성할 수 있습니다 (클래스를 C++의 컴파일 시간과 달리 런타임에 가져 오는 것). 동질성이긴하지만 제한 사항이 추가됩니다. 요소는 여전히 id이 될 것입니다. MutableCMParticleArray, MutableNSNumberArray

이에서
+0

도움을 주셔서 감사합니다. – jdeckman

+0

무엇? 배열 요소의 할당을 변수로 타입 변환 할 필요가 없습니다. 이 문제는 색인 된 접근 자 구문과 관련이 있습니까?왜냐하면 나는'objectAtIndex :'와 동등한 코드를 수년간 쓰고 있었기 때문에 결코 캐스팅 할 필요가 없었습니다. – Chuck

+0

@Chuck : 죄송합니다. 저는 그 부분을 오도하는 듯합니다. 내가 고칠 수있게 해줘. – abarnert