2009-06-12 3 views
8

주석에 표시되는 내용 : @property/@synthesize 구문을 사용하여 Objective-C 2.0 클래스에서 속성을 정의하고 싶습니다. 그러나 속성에 허용되는 값의 범위에 제한을 설정하고 싶습니다. 예를 들면 :@synthesized 메서드를 사용하여 Objective-C에서 @property 값의 유효성을 검사 할 수 있습니까?

@interface MyClass : NSObject { 
    int myValue; 
} 

@property (nonatomic) int myValue; 

구현 : 여기 구문은 단지 예이다

@implementation MyClass 

@synthesize myValue(test='value >= 0'); 

참고. 이것인가, 아니면 가능할 것 같은 것이 있습니까? 또는, 합성 된 setter의 리터럴 상당 부분은 무엇이며, 따라서 합성 된 세트에서 사용되는 것과 동일한 객체 보유 규칙을 수동 설정자에서 사용하도록 할 수 있습니다.

+0

'코코아'및 'macosx'로 태그 지정하는 것이 좋습니다. 나는 그것에 대한 명성이 충분히 높지 않다. – toholio

답변

7

가정 당신의 재산을 준수 키 - 값입니다 당신은 또한 키 - 값을 준수 유효성 검사기를 구현해야합니다 (당신이 @synthesize를 사용하는 경우가 될 것 같은). 이 문제에 관한 Apple의 문서를 살펴보십시오. http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html

중요 사항은 특정 종류의 바인딩을 사용하는 경우를 제외하고 유효성 검사가 자동으로 수행되지 않는다는 것입니다. 유효성 검사기에 직접 전화 하시거나 validateValue:forKey:error:으로 전화하십시오.

저장하기 전에 생성자를 호출하기 위해 유효성 검사기를 호출 할 수 있지만 바인딩을 사용하는 경우 유효성 검사기가 단일 수정에 대해 두 번 이상 호출 될 수 있기 때문에 원하는 작업이 아닐 수 있습니다.

또한 유효성 검사기는 유효성을 검사하는 값을 변경할 수 있습니다.

그럼 예제 (테스트되지 않은, btw.내가) 맥 근처에 아니에요 :

@implementation MyClass 

@synthesize myValue; 

-(BOOL)validateMyValue:(id *)ioValue error:(NSError **)outError 
{ 
    if (*ioValue == nil) { 
    // trap this in setNilValueForKey 
    // alternative might be to create new NSNumber with value 0 here 
    return YES; 
    } 

    if ([*ioValue intValue] < 0) { 
    NSString *errorString = @"myValue must be greater than zero"; 
    NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorString 
                  forKey:NSLocalizedDescriptionKey]; 

    NSError *error = [[[NSError alloc] initWithDomain:@"MyValueError" 
               code:0 
              userInfo:userInfoDict] autorelease]; 

    *outError = error; 

    return NO; 
    } else { 
    return YES; 
    } 
} 

당신이 합성 세터를 무시하고 검증 (아직 검증되지 않은) 할 수 있도록하고 싶었다면 :

- (void)setMyValue:(int)value { 

    id newValue = [NSNumber numberWithInt:value]; 
    NSError *errorInfo = nil; 

    if ([self validateMyValue:&newValue error:&errorInfo]) { 
    myValue = [newValue intValue]; 
    } 
} 

당신은 볼 수 우리는 포장했다 NSNumber 인스턴스의 정수.

+4

문서에 따르면 설정 도구에서 유효성 검사 메서드를 호출하면 안됩니다. http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/Validation.html#//apple_ref/doc/uid/20002173-166962 –

2

@synthesize를 사용하면 접근 자 메서드가 생성됩니다. 생성 된 것을 겹쳐 쓸 독자적인 것을 구현할 수 있습니다.

접근 방식에 내부적으로 구현할 수 있습니다 (예 : 할당 전에 값 확인을 추가 할 수 있습니다.

당신은 구현할 수없는 것들이 @synthesize 때문에 생성 될 것이고, @dynamic을 사용한다면 당신은 컴파일이나 런타임에 접근자를 제공하도록 지정하고 있습니다.

접근자는 속성 이름 mypropertysetMyproperty에서 파생 된 이름을 갖습니다. 메소드 서명은 표준이므로 직접 구현할 수 있습니다. 실제 구현은 속성 정의 (copy, retain, assign) 및 읽기 전용인지 여부에 달려 있습니다 (읽기 전용은 접근자를 설정하지 않습니다). 자세한 내용은 objective-c 참조를 참조하십시오.

Apple reference: 당신은 당신이 내에서 공급하지 않는 경우가 세터 및/또는 속성에 대한 getter 메소드를 합성해야 컴파일러에게하는 @synthesize에게 키워드를 사용 @synthesize

@ 구현 블록.

@interface MyClass : NSObject 
{ 
    NSString *value; 
} 
@property(copy, readwrite) NSString *value; 
@end 


@implementation MyClass 
@synthesize value; 

- (NSString *)value { 
    return value; 
} 

- (void)setValue:(NSString *)newValue { 
    if (newValue != value) { 
     value = [newValue copy]; 
    } 
} 
@end 
관련 문제