Giả sử tài sản của bạn là Key-Value phù hợp (như họ sẽ là nếu bạn đang sử dụng @synthesize), bạn cũng nên thực hiện Key-Value xác nhận tuân thủ. Hãy xem tài liệu của Apple về vấn đề này: http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/Validation.html
Điều quan trọng cần lưu ý là việc xác thực không xảy ra tự động trừ khi sử dụng một số loại ràng buộc nhất định. Bạn gọi trực tiếp cho bên xác nhận hoặc bằng cách gọi số validateValue:forKey:error:
.
Bạn có thể ghi đè trình setter để gọi trình xác nhận trước khi lưu nó nhưng nếu bạn đang sử dụng các ràng buộc, đây có thể không phải là những gì bạn muốn làm khi trình xác thực có thể được gọi nhiều lần.
Cũng lưu ý rằng trình xác thực có thể thay đổi giá trị đang được xác thực.
Vì vậy, hãy xem ví dụ của bạn (chưa được kiểm tra, btw.Tôi không ở gần máy Mac):
@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;
}
}
Nếu bạn muốn ghi đè lên các setter tổng hợp và làm cho nó thực hiện xác nhận (vẫn chưa được kiểm tra):
- (void)setMyValue:(int)value {
id newValue = [NSNumber numberWithInt:value];
NSError *errorInfo = nil;
if ([self validateMyValue:&newValue error:&errorInfo]) {
myValue = [newValue intValue];
}
}
Bạn có thể thấy chúng tôi phải quấn số nguyên trong một trường hợp NSNumber để làm điều này.
Điều này có thể gắn thẻ giá trị này với 'ca cao' và 'macosx'. Tôi không có một danh tiếng đủ cao cho nó. – toholio