2010-12-05 3 views
1

C 구조체와 오브젝티브 C 속성을 ... 혼합나는 CGPoint의 바르와 객체를 정의하고 다음과 같이 속성을 연결 한

@interface Sprite : NSObject { 
CGRect boundingBox; 
} 
@property(assign) CGRect boundingBox; 

내가 Sprite 클래스의 인스턴스를 사용하여 BoundingBox의 시도 및 업데이트 구조체는

좌변,745의 왼쪽 피연산자로 요구 ...

self.boundingBox.origin.x = minX; 

내가 내용의 컴파일시 오류가 발생합니다 ... 다음과 같이할당

는 self.boundingBox 실제로 Sprite 객체가 아니라 그것의 사본을 보유하는 구조체가 아닌 C 구조체를 반환 것이라고 말에 나는 수정이 있습니까? 따라서 struct가 임시 복사본 일 뿐이므로 x에 대한 새 값 할당이 실패하면?

이 경우 다음 코드가 올바르게 작동합니다 (원하는 결과를 얻으려면 올바른 방법입니까?).

CGRect newBoundingBox = self.boundingBox; 
newBoundingBox.origin.x = self.boundingBox.origin.x; 
self.boundingBox = newBoundingBox; 

답변

1

수정 된 답변 : CGRect를 편집 할 수 없다는 본인의 원래 의견이 잘못되었습니다. 첫 번째 코드 줄의 실제 문제는 self.boundingBox을 사용하여 CGRect에 액세스한다는 사실에서 비롯됩니다.

가 제대로 boundingBox 내부 값을 변경하려면, 당신과 같이, 사과의 CGRectMake 기능을 사용해야합니다 : 들어

CGRect r = self.boundingBox; 
self.boundingBox = CGRectMake(minX, r.y, r.width, r.height); 

두 번째 코드는 내 원래 대답했다 블록과 함께 잘 작동합니다 왜 self. 표기법이 구조체에 문제가되는지에 대한 좋은 설명은 this question에 대한 답변을 확인하십시오. 희망이 도움이!

+0

고마워요! 모든 CGRect를 편집 할 수 없다는 점을 제외하고는 모두 의미가 있습니다. 무엇 때문에 그렇게하지 못하게합니까?C 구조체가 변경 가능하지 않습니까? – mmccomb

+0

와우, 여기 내 사과 - 나는이 주석을 완전히 오독했다. 나는 이것에 대한 정확한 정보를 포함하도록 나의 대답을 업데이트했다. –

+0

의미가 있습니다. :) – mmccomb

2

속성은 setter 및 getter 메서드에 대한 구문 별칭 일 뿐이라는 것을 기억하십시오. 이 :

self.boundingBox = newBox; 

이하는 것과 같습니다

[self setBoundingBox:newBox]; 

이 작업을 수행 할 수 없습니다 이유 : setBoundingBox:를 호출 만에 질문 할 수있는 방법이 없기 때문에

self.boundingBox.origin.x = minX; 

인가 origin.x을 변경하고 구조체의 개별 부분에 사용할 수있는 개별 설정 메소드가 없습니다. 귀하의 질문의 끝에있는 예제는 당신이 속성을 통해 무엇을 하려는지를 성취 할 수있는 유일한 방법입니다.

당신은 원인의 특성에 대해 잊고이 작업을 수행 할 수 있습니다

boundingBox 인스턴스 변수 (있는 가정) 현재의 객체에 직접 기록하지만, 바람직하지 않을 수 setter 메소드를 무시
boundingBox.origin.x = minX 

.

관련 문제