English 中文(简体)
重写setter方法,并获取信息
原标题:
  • 时间:2009-04-13 20:04:53
  •  标签:

我有一个setter方法(setMinimumNumberOfSides),我想在使用synthesis后覆盖它。在它中,我对实例变量施加了一个约束,以确保int在一定的范围内。

稍后在自定义init方法中,我将设置另一个实例变量(numberOfSides),但我需要确保minimumNumberOfSides和maximumNumberOfSides在边界内正确设置。我尝试将setter上的返回值更改为BOOL,这样如果成功/失败,我就可以返回YES或NO,但这创建了一个冲突的方法,我猜是因为我正在使用合成和重写setter。

如何轻松地获取信息以检查setter是否被调用并成功返回?

-(void)setNumberOfSides:(int)sides
{
    if ((sides < maximumNumberOfSides) && (sides > minimumNumberOfSides))
    {
        numberOfSides = sides;  
    }
    else
        NSLog (@"Invalid number of sides: %d is outside the constraints allowed", sides);


}

-(void)setMinimumNumberOfSides:(int)minimum 
{
    if (minimum > 2)
        minimumNumberOfSides = minimum;

}

-(void)setMaximumNumberOfSides:(int)maximum 
{
    if (maximum <= 12)
        maximumNumberOfSides = maximum;

}

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max 
{
    if (self = [super init])
    {
        self.minimumNumberOfSides = min;
        self.maximumNumberOfSides = max;

        self.numberOfSides = sides;
    }
    return self;
}
最佳回答

如果您计划实现getter和setter,则不必合成numberOfSides。如果没有@synthe-numberOfSides,您可以选择返回BOOL。您需要相应地在接口中声明getter/setter。

顺便说一句,另一种方法是使用合成的getter/setter,并添加一个单独的方法-(BOOL)isNumberOfSidesValid来执行此检查。

问题回答

在这种情况下,最好使用对assert()的简单调用,或者抛出异常。

选择将取决于您如何看待这个类的使用。如果它将是库的一部分,并且您希望其他开发人员经常为minimumNumberOfSidesmaximumNumberOfSides提供不正确的值,那么您可能应该抛出一个适当的异常。

不过,还是要提醒一下。如果您希望应用程序的用户经常提供不正确的值,那么出现异常是个坏主意。Objective-C中的异常处理是一项昂贵的操作。如果这些检查是为了用户而进行的,那么您应该执行输入验证,并以更友好的方式向用户报告错误。

edit:以下是一些快速示例代码:

-(void)setMinimumNumberOfSides:(int)minimum
{
    if (minimum <= 2)
    {
        [NSException raise:@"invalid minimumNumberOfSides value"
                    format:@"value of %d is too low (must be > 2)", minimum];
    }

    minimumNumberOfSides = minimum;
}

编辑:这是另一个SO问题,详细介绍了Objective-C中的异常处理。





相关问题