Cocoa touch 您应该如何验证传递给Cocoa中setter的值?

Cocoa touch 您应该如何验证传递给Cocoa中setter的值?,cocoa-touch,cocoa,getter-setter,validation,Cocoa Touch,Cocoa,Getter Setter,Validation,我正在阅读苹果的介绍性指南,该指南鼓励开发者使用NSErrors,而不是抛出异常 在本例中,我对如何验证传递给setter的数据感到有点困惑。例如,假设您有一个设置:方法;如何验证输入的年龄是否大于0?您会让程序以无效的年龄运行吗?通常您会确保设置模型对象年龄的控制器验证该值。例如,如果要求用户指定年龄,视图控制器将解析输入,验证输入,然后将其传递给适当的模型对象 或者,可以在模型对象中实现。请看最后一节,这恰好是您的示例: - (BOOL)validateAge:(id *)ioValue e

我正在阅读苹果的介绍性指南,该指南鼓励开发者使用
NSError
s,而不是抛出异常


在本例中,我对如何验证传递给setter的数据感到有点困惑。例如,假设您有一个
设置:
方法;如何验证输入的年龄是否大于0?您会让程序以无效的年龄运行吗?

通常您会确保设置模型对象年龄的控制器验证该值。例如,如果要求用户指定年龄,视图控制器将解析输入,验证输入,然后将其传递给适当的模型对象

或者,可以在模型对象中实现。请看最后一节,这恰好是您的示例:

- (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;
    }
    // ...
-(BOOL)validateAge:(id*)ioValue错误:(n错误*\u自动删除*)外部错误{
如果(*ioValue==nil){
//把这个放在塞特尼勒福基。
//另一种方法是在此处创建值为0的新NSNumber。
返回YES;
}
如果([*ioValue floatValue]是断言(因为调用方应该已经验证)或异常(同上),或者只是忽略问题。setter模拟对变量的简单赋值,因此不需要执行正式验证。或者您可以实现单独的setValue:error:method(不能与点赋值符号一起使用)并在@property语句中将var标记为只读


在调用“set”方法的方法验证该值之前,不应将该值设置到属性中。在“set”方法中的任何检查都纯粹是为了检测错误。

断言(因为调用方应已验证)或异常(同上)或者忽略这个问题。setter模拟对变量的简单赋值。或者您可以实现一个单独的
setValue:error:
方法(不能与点赋值符号一起使用)并在@property语句中将var标记为只读。@HotLicks:为了详细说明您的观点“忽略问题”,我从苹果指南和斯坦福大学的讲座中得到的印象是:1.您应该只设置值是否有效,2.您应该在使用它之前检查值是否有效。正确吗?我可以看到它比使用异常和错误要“轻”得多,但感觉不安全。关键是,在调用“set”方法的方法验证属性之前,不应将该值设置到属性中。在“set”方法中进行任何检查纯粹是为了检测错误。注:Cocoa(或cococoa Touch)是框架,它决定了风格和设计决策。Objective-C是框架实现时使用的语言。这实际上是一个非常有用的注释;谢谢,Josh:)!但键值验证准则规定不应在setter方法中使用验证。不应。在调用setter之前调用它。如果返回“是”,则设置新值。如果返回“否”,则显示错误消息。