10

IOS でキー値の検証を使用する方法の例を教えてもらえますか? 私は混乱しています。

人々がクレジットカード番号、セキュリティコードなどを Card クラスに渡す Payments SDK を作成しています。これらの値を検証する必要があります。たとえば、クレジット カード番号が有効であることを確認します。

自動検証を行うことは可能ですか?

また、すべてのバリデータを一度に呼び出すことはできますか?

Card クラスがある場合のように、 if([card isValid]) を呼び出して、自分で実行せずにすべての検証関数を一度に呼び出すことはできますか? お気に入り:

Card * card = [[Card alloc] init];
card.number = @"424242...";
card.securityCode = @"455";
card.expirationMonth = @"";
card.expirationYear = @"";
if([card isValid]) {

ご協力いただきありがとうございます!

4

3 に答える 3

6

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;
}
于 2013-10-20T13:06:13.697 に答える
2

キー値検証の例を次に示します。

アップルによると:

キー値コーディングは、プロパティ値を検証するための一貫した API を提供します。検証インフラストラクチャは、値を受け入れるか、代替値を提供するか、プロパティの新しい値を拒否してエラーの理由を示す機会をクラスに提供します。

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/KeyValueCoding/Articles/Validation.html

メソッド署名

-(BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError {
    // Implementation specific code.
    return ...;
}

メソッドの適切な呼び出し

Apple: 検証メソッドを直接呼び出すか、validateValue:forKey:error: を呼び出してキーを指定することで呼び出すことができます。

私たちのもの:

//Shows random use of this
    -(void)myRandomMethod{

        NSError *error;

        BOOL validCreditCard = [self validateCreditCard:myCreditCard error:error];
    }

リクエストのテスト実装

    //Validate credit card
    -(BOOL)validateCreditCard:(id *)ioValue error:(NSError * )outError{

        Card *card = (Card*)ioValue;

        //Validate different parts
        BOOL validNumber = [self validateCardNumber:card.number error:outError];
        BOOL validExpiration = [self validateExpiration:card.expiration error:outError];
        BOOL validSecurityCode = [self validateSecurityCode:card.securityCode error:outError];

        //If all are valid, success
        if (validNumber && validExpiration && validSecurityCode) {
            return YES;

            //No success
        }else{
            return NO;
        }
    }

    -(BOOL)validateExpiration:(id *)ioValue error:(NSError * )outError{

        BOOL isExpired = false;

        //Implement expiration

        return isExpired;
    }

    -(BOOL)validateSecurityCode:(id *)ioValue error:(NSError * )outError{

    //card security code should not be nil and more than 3 characters long
    if ((*ioValue == nil) || ([(NSString *)*ioValue length] < 3)) {

        //Make sure error us not null
        if (outError != NULL) {

            //Localized string
            NSString *errorString = NSLocalizedString(
                                                      @"A card's security code must be at least three digits long",
                                                      @"validation: Card, too short expiration error");

            //Place into dict so we can add it to the error
            NSDictionary *userInfoDict = @{ NSLocalizedDescriptionKey : errorString };

            //Error
            *outError = [[NSError alloc] initWithDomain:CARD_ERROR_DOMAIN
                                                   code:CARD_INVALID_SECURITY_CODE
                                               userInfo:userInfoDict];
        }
        return NO;
    }
    return YES;
}

    -(BOOL)validateCardNumber:(id *)ioValue error:(NSError * )outError{

        BOOL isValid = false;

        //Implement card number verification

        return isValid;
    }
于 2013-10-20T13:31:02.113 に答える