2014-04-24 2 views
5

나는 이런 식으로 뭔가 보이는 헤더 클래스 A가 :설정 값은

typedef struct { 
    int x; 
    int y; 
} Position; 

@interface ClassA : NSObject 

@property Position currentPosition; 

@end 

을 그리고 나는 속성에서 위치 구조체의 개별 값을 할당하려고

ClassA * classA = [ClassA new]; 
classA.currentPosition.x = 10; 

"표현식을 할당 할 수 없습니다"라는 오류가 발생하며 컴파일되지 않습니다.

ClassA * classA = [ClassA new]; 
Position position = { 
    .x = 1, 
    .y = 2 
}; 

classA.currentPosition = position; 

그리고 난 이런 position 변수의 개별 "속성"변경할 수 있습니다 :

I는 다음과 같이 설정할 수 있습니다

ClassA * classA = [ClassA new]; 
Position position = { 
    .x = 1, 
    .y = 2 
}; 

// WORKS 
position.x = 4;  

// DOESN'T WORK 
// classA.currentPosition.x = 4; 

classA.currentPosition = position; 

가 왜 개별적 때 값을 설정할 수 없습니다

을 그들이 재산이야?

+0

typedef를 사용한 경우 @property 선언에 'struct'를 추가 할 필요가 없습니다. –

+0

@NicolasMiari - 나는 그것을 고치고, 다른 선언 방법을 시도해 왔으며, 나는 잘못된 것들을 복사했다. – Logan

+0

pre-declared-property 임에도 불구하고 [CGRect가 인스턴스 일 때 CGRect 요소에 대한 할당 액세스 방법] (http://stackoverflow.com/q/5860755)을 참조하십시오. –

답변

6

이 표현 :

classA.currentPosition 

이 구조체의 임시 복사본이 아닌 구조체 자체를 반환합니다. 컴파일러 오류는 임시 복사본의 일부 구성원에게 값을 할당 할 수 없다는 것을 알려줍니다 (기술적으로 rvalue이기 때문에). 하지만 구조체 자체와 함께 사라지므로 어쨌든 멤버에게 값을 할당하고 싶지는 않습니다.

그래서 구조체의 복사본을 처음으로 얻는 이유는 무엇입니까?

@property Position currentPosition 

실제로 단지에 대한 속기

때문에 :

-(Position)currentPosition; 
-(void)setCurrentPosition(Position value); 

및 C-가족의 언어로, 첫 번째 줄 (게터), 그것은별로 값이 위치 구조체를 반환 있음을 나타냅니다 또는 사본으로.

참조를 반환하는 사용자 고유의 접근자를 만들 수 있지만 그렇게해서는 안됩니다. 이것은 Objective-C의 공통된 관용구가 아니며 최소한이 맥락에서는 그렇지 않습니다. 일반적으로 언어에 대한 일반적인 숙어를 고수해야합니다.

대신 다음과 같이 위치를 사용해야합니다. 당신이 정말로 오브젝티브 C의 숙어를 maintaing하면서, 원래 원하는 구문을 사용하여 currentPosition을 설정 할 수 있도록하려면

Position pos = classA.position; 
pos.x = 4; 
classA.position = pos; 

마지막으로, 당신은 단지 위치 클래스가 아닌 구조체 만들 수 있습니다. 그런 다음 속성은 Position *을 반환 할 수 있으며 구문의 나머지는 작동합니다. init 함수에서 (또는 적절한 경우) 포인터를 초기화하십시오.

+1

이것은 내 질문에 대답하는 것,하지만 왜 내가 downvote있어 궁금 해서요? 이 오류를 일으키는 것이 있습니까? – Logan

+0

구조체의 속성 중 하나를 지정하려면 매번 3 줄이 필요합니다. 그것은 당신이 그것을 액세스 할 때마다 구조체를 복제합니다. 따라서 실제로 속성을 할당하지 않고, 다른 값을 가진 구조체의 새로운 인스턴스를 끊임없이 만들어야합니다. – manecosta

2

속성은 C 구조체에서 작동하지 않습니다.

당신은 그것을 좋아 할 수 있습니다 : 기본적으로

@property Position *currentPosition; 

를, 포인터를 사용하여. 당신이 포인터를 상대하고 있기 때문에, 화살표 표기법을 사용하는 것을 잊지 마세요, 그리고

- (id) init { 
    self = [super init]; 
    if(self){ 
     self.currentPosition = malloc(sizeof(Position)); 
    } 
    return self; 
} 

:

classA.currentPosition->x = 5; 

그리고 돈

이제 당신은 실제로 그래서 포인터를 초기화해야 요청한 메모리를 확보하는 것을 잊지 마십시오!

-(void)dealloc{ 
    free(self.currentPosition); 
} 
+1

이 작업을 수행 할 수는 있지만 유효하지는 않습니다 (관례가 아닙니다). 똑같은 일을하는 더 나은 목표 -C 방법이 있습니다. – adpalumbo

+0

이것은 'self.currentPosition = malloc (sizeof (Position))'에 에러를 준다. - 호환되지 않는 타입 'void *'에서 'Position'에 할당한다. " – Logan

+2

이 에러는 속성 선언을 a 포인터, @Logan. –