나는 이미 게시 된 질문을 광범위하게 읽었으므로 찾고있는 대답을 찾을 수 없습니다.목표 C - 접근 자 즉 Getters/Setters
나는 완전히 (내가 @property int width
및 @synthesize width
이 있다면 즉, 내가 실수 width
의 getter 메소드와 setWidth:
의 setter 메소드를 만드는 오전) getter와 setter 메소드를 만들 @syntesize
지시어를 사용하여 개념을 이해합니다.
그러나 @synthesize
지시문을 사용하고 있지 않지만 객체 인 @implementation
섹션의 인스턴스 변수를 선언 할 때 접근 자 방법의 작동 방식을 완전히 이해하지 못했습니다.
1) main
에 말한다 : 처음 그 [myRect origin1]
를 결정하는 것 [[myRect origin1] x]
메소드를 호출하는 것처럼
NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);
그것은 나에게 나타납니다 이것은 내가 다음 코드에 대해 이해하지 못하는 것입니다 origin
을 반환하고 즉시 [origin x]
을 호출합니다 (그리고 y
에 대해서도 동일하게 수행합니다). 자, 저를 발생하는 것은 사실입니다 나는 프로그램이 오류의 톤을 얻고 중단
-(XYpoint *) origin2;
에
-(XYpoint *) origin1;
이 Rectangle.h에 포함 된 getter 메소드의 이름을 변경한다면 엮다. 참고 : 나는 또한 사방이 방법의 이름을 변경 그 것이다 나 또한에서 setter 메소드의 이름을 변경하는 경우에는
NSLog(@"Origin at (%i, %i)", myRect.origin2.x, myRect.origin2.y);
에 주에 위의 코드 변경을 포함하여 참조 :에
-(void) setOrigin1: (XYpoint *) pt
:
-(void) setOrigin2: (XYpoint *) pt
모든 것이 이전처럼 작동합니다. 내 getter와 setter가 둘 다 x
setX
명명 규칙에 명명 된 경우에만 제대로 작동하는 것 같습니다. 나는 이것이 내가 주로 필요한 부분이라고 생각한다 :
가) 객체 (예 : 'origin')와 같은 인스턴스 변수를 만들면, getter와 setter 메소드를 생성해야합니까?
B는) 내가 그 getter 메소드 아니지만 setter 메소드 또는를 만들 수도 마찬가지
C)가 필수 그게 나는 그들이 모두에 이름이 될 수 있음을 '기원'에 대한 getter와 setter 방법 모두를 생성 할 경우 x
setX
방식. 이 경우 -(XYpoint *) origin1
및 -(void) setOrigin1: (XYpoint *) pt
입니다. getter의 이름을 변경하는 경우 그에 따라 setter의 이름을 변경해야합니다.
여기에 모든 코드입니다 :
Rectangle.h :
#import <Foundation/Foundation.h>
@class XYpoint;
@interface Rectangle : NSObject
@property int width, height;
-(XYpoint *) origin1;
-(void) setOrigin1: (XYpoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h;
-(int) area;
-(int) perimeter;
@end
사각형.m :
#import "Rectangle.h"
@implementation Rectangle
{
XYpoint *origin;
}
@synthesize width, height;
-(void) setWidth:(int) w andHeight:(int)h
{
width = w;
height = h;
}
-(void) setOrigin1: (XYpoint *) pt
{
origin = pt;
}
-(int) area
{
return width * height;
}
-(int) perimeter
{
return (width + height) * 2;
}
-(XYpoint *) origin1
{
return origin;
}
@end
XYpoint.h :
#import <Foundation/Foundation.h>
@interface XYpoint : NSObject
@property int x, y;
-(void) setX: (int) xVal andY: (int) yVal;
@end
XYpoint.m :
#import "XYpoint.h"
@implementation XYpoint
@synthesize x,y;
-(void) setX: (int) xVal andY: (int) yVal
{
x = xVal;
y = yVal;
}
@end
main.m : 당신은 가능성이 가장 높은 방법을 변경하는 것을 잊었다
#import <Foundation/Foundation.h>
#import "Rectangle.h"
#import "XYpoint.h"
int main (int argc, const char * argv[])
{
@autoreleasepool {
Rectangle *myRect = [[Rectangle alloc] init];
XYpoint *myPoint = [[XYpoint alloc] init];
[myPoint setX: 100 andY: 200];
[myRect setWidth: 5 andHeight:8];
myRect.origin1 = myPoint;
NSLog(@"Rectangle w = %i, h = %i", myRect.width, myRect.height);
NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);
NSLog(@"Area = %i, Perimeter = %i", [myRect area], [myRect perimeter]);
}
return 0;
}
도트 표기법은 접근 자 호출의 바로 단축형입니다. myRect.origin2는 [myRect origin2] 또는 [myRect setOrigin2]와 같을 수 있기 때문에 컨텍스트에 따라 도트 표기법을 사용하려면 두 액세서를 모두 정의해야합니다. 그럼에도 불구하고 Jakob의 대답처럼 실제로 인스턴스 변수를 속성으로 선언해야합니다. – spwert
고마워요! 그게 내 문제 야. getter (또는 setter)를 setOrigin1에서 setOrigin2로 변경하면 myRect.origin1을 호출 할 때 그에 따라 getter/setter가 모두 필요합니다. 그리고 setOrigin1을 setOrigin2로 변경 했으므로 더 이상 getter와 setter가 둘 다 없습니다. 비록 내가 그것을 사용하지 않더라도 컴파일러는 그것을 요구한다. 적어도 나는 당신이 의미하는 바를 믿습니다. 그렇다면 이제는 나에게 의미가있다. 비록 내가 당신에게 "올바른"대답을주는 방법을 모르겠지만, 단지 코멘트로 나열된 이후 – ReiAndCoke
이것은 잘못된 것입니다. 두 접근 자 모두 필요하지 않습니다. 헤더 파일에'- (int) foo;'를 정의하면'int x = myObj.foo;'를 사용할 수있다. 반면, 헤더 파일에'- (void) setBar : (int) anInt;'를 정의하면,'myObj.bar = 15;'를 사용할 수있다. 게터와 세터는 독립적입니다. –