Susan が提供するリンクには、必要なすべての詳細が含まれています。実装例は次のようになります。
- (BOOL)validateSecurityCode:(id *)ioValue
error:(NSError * __autoreleasing *)outError
{
// The securityCode must be a numeric value exactly 3 digits long
NSString *testValue = (NSString *)*ioValue;
if (([testValue length]!=3) || ![testValue isInteger])) {
if (outError != NULL) {
NSString *errorString = NSLocalizedString(
@"A Security Code must be exactly 3 characters long.",
@"validation: Security Code, invalid value");
NSDictionary *userInfoDict = @{ NSLocalizedDescriptionKey : errorString };
*outError = [[NSError alloc] initWithDomain:SECURITYCODE_ERROR_DOMAIN
code:SECURITYCODE_INVALID_NAME_CODE
userInfo:userInfoDict];
}
return NO;
}
return YES;
}
注:この投稿NSString -isInteger
から使用しました。
マニュアルによると
検証メソッドを直接呼び出すか、validateValue:forKey:error:を呼び出してキーを指定することにより、検証メソッドを呼び出すことができます。
これの利点は、- (BOOL)isValid
メソッドが非常に単純になることです。
- (BOOL)isValid
{
static NSArray *keys = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
keys = @[@"securityCode", @"number", @"expirationMonth", @"expirationYear"];
});
NSError *error = nil;
for (NSString *aProperty in keys) {
BOOL valid = [self validateValue:[self valueForKey:aProperty]
forKey:aProperty
error:&error];
if (!valid) {
NSLog("Validation Error: %@", error);
return NO;
}
}
return YES;
}