2010-06-01 5 views
16

일부 구조체를 저장하고 액세스하려고하는 NSMutableArray가 있습니다. 어떻게해야합니까? 'addObject'는 "addObject의 인수 1에 대해 호환되지 않는 유형"이라는 오류를 표시합니다. 당신이 클래스에 구조체를 포장해야하므로 NSMutableArray 만, 객체에 대한 참조를 받아 들일 수 있기 때문에 오류를 얻고있다코코아 구조체 및 NSMutableArray

//Write points 
for(int i=0; i<5; i++) { 
    struct Point p; 
    buff = [in readDataOfLength:1]; 
    [buff getBytes:&(p.x) length:sizeof(p.x)]; 
    [array addObject:p]; 
} 

//Read points 
for(int i=0; i<5; i++) { 
    struct Point p = [array objectAtIndex:i]; 
    NSLog(@"%i", p.x); 
} 

답변

45

, NSValue+value:withObjCType: 또는 -initWithBytes:objCType:를 사용하여 일반 구조체를 포장 할 수 있습니다

// add: 
[array addObject:[NSValue value:&p withObjCType:@encode(struct Point)]]; 

// extract: 
struct Point p; 
[[array objectAtIndex:i] getValue:&p]; 

이 더 많은 예제에 대한 Number and Value guide를 참조하십시오.

+0

up vote 모든 것을 말하고 있습니다 :) – TheTiger

+1

당신이 누구인지는 모르겠지만, 저는 당신을 찾아 맥주를 갖게 될 것입니다! – CjCoax

3

예를 들면 다음과 같습니다 (A NSFileHandle이다 '에서', '배열'입니다있는 NSMutableArray)입니다 :

@interface PointClass { 
    struct Point p; 
} 

@property (nonatomic, assign) struct Point p; 

이렇게하면 PointClass의 인스턴스를 전달할 수 있습니다.

편집 : : 위에서 언급 한 바와 같이 NSValue는 이미 일반적인 방식으로이 기능을 제공하므로이 기능을 사용해야합니다.

+5

NSValue는 이미 필요한 기능을 제공합니다. – JeremyP

2

NSValue를 사용할 수도 있고, 경우에 따라 구조체 대신 사전을 사용하는 것이 좋습니다.

언급 한 바와 같이