Проверка значения ключа

Кодирование значения ключа обеспечивает непротиворечивый API для проверки значения свойства. Инфраструктура проверки обеспечивает класс возможность принять значение, обеспечить альтернативное значение, или отклонить новое значение для свойства и объяснить ошибку.

Соглашение о присвоении имен метода проверки

Так же, как существуют соглашения для именования методов доступа, существует соглашение для именования метода проверки свойства. Метод проверки имеет формат validate<Key>:error:. Пример в Перечислении 1 показывает объявление метода проверки для свойства name.

  Объявление метода Проверки перечисления 1 для имени свойства

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

Реализация метода проверки

Методы проверки передаются два параметра ссылкой: объект значения проверить и NSError раньше возвращал информацию об ошибке.

От метода проверки существует три возможных исхода:

  1. Объектное значение допустимо, таким образом, YES возвращается, не изменяя объект значения или ошибку.

  2. Объектное значение не допустимо, и допустимая ценность не может быть создана и возвращена. В этом случае NO возвращается после установки параметра ошибок к NSError объект, указывающий причину отказавшая проверка.

  3. Новая объектная ценность, которая допустима, создана и возвращена. В этом случае YES возвращается после установки параметра, передаваемого по значению к недавно созданной, допустимой ценности. Ошибка возвращается неизменная. Необходимо возвратить новый объект, вместо того, чтобы просто изменить переданный ioValue, даже если это является непостоянным.

    Этому варианту обычно обескураживают, потому что может быть трудно гарантировать, что значения последовательно распространяются.

Пример в Перечислении 2 реализует метод проверки для a name свойство, гарантирующее, что объект значения является строкой и что имя капитализируется правильно.

  Метод Проверки перечисления 2 для свойства имени

-(BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError{
 
    // The name must not be nil, and must be at least two characters long.
    if ((*ioValue == nil) || ([(NSString *)*ioValue length] < 2)) {
        if (outError != NULL) {
            NSString *errorString = NSLocalizedString(
                    @"A Person's name must be at least two characters long",
                    @"validation: Person, too short name error");
            NSDictionary *userInfoDict = @{ NSLocalizedDescriptionKey : errorString };
            *outError = [[NSError alloc] initWithDomain:PERSON_ERROR_DOMAIN
                                                    code:PERSON_INVALID_NAME_CODE
                                                userInfo:userInfoDict];
        }
        return NO;
    }
    return YES;
}

Вызов методов проверки

Можно вызвать методы проверки непосредственно, или путем вызова validateValue:forKey:error: и указание ключа. Реализация по умолчанию validateValue:forKey:error: ищет класс получателя для метода проверки, имя которого соответствует образец validate<Key>:error:. Если такой метод найден, он вызывается, и результат возвращается. Если никакой такой метод не найден, validateValue:forKey:error: возвраты YES, проверка значения.

Автоматическая проверка

В целом кодирование значения ключа не выполняет проверку автоматически — это - ответственность Вашего приложения вызвать методы проверки.

Некоторые технологии действительно выполняют проверку автоматически при некоторых обстоятельствах: Когда контекст управляемого объекта сохраняется, базовые Данные автоматически выполняют проверку; в OS X привязка Какао позволяет Вам указывать, что проверка должна произойти автоматически (см., что Привязка Какао Программирует Темы для получения дополнительной информации).

Проверка скалярных значений

Методы проверки ожидают, что параметр, передаваемый по значению будет объектом, и в результате оценивает за несвойства объектов, обертываются в NSValue или NSNumber возразите, как обсуждено в Поддержке Скаляра и Структуры. Пример в Перечислении 3 демонстрирует метод проверки для скалярного свойства age.

  Метод Проверки перечисления 3 для скалярного свойства

-(BOOL)validateAge:(id *)ioValue error:(NSError * __autoreleasing *)outError {
 
    if (*ioValue == nil) {
        // Trap this in setNilValueForKey.
        // An alternative might be to create new NSNumber with value 0 here.
        return YES;
    }
    if ([*ioValue floatValue] <= 0.0) {
        if (outError != NULL) {
            NSString *errorString = NSLocalizedStringFromTable(
                @"Age must be greater than zero", @"Person",
                @"validation: zero age error");
            NSDictionary *userInfoDict = @{ NSLocalizedDescriptionKey : errorString };
            NSError *error = [[NSError alloc] initWithDomain:PERSON_ERROR_DOMAIN
                code:PERSON_INVALID_AGE_CODE
                userInfo:userInfoDict];
            *outError = error;
        }
        return NO;
    }
    else {
        return YES;
    }
    // ...