覆盖setter方法,并获取信息

时间:2009-04-13 20:04:54

标签: objective-c initialization setter

我有一个setter方法(setMinimumNumberOfSides),我想在使用synthesize后覆盖它。在其中,我对实例变量进行约束以确保int在某些范围内。

稍后在自定义init方法中,我正在设置另一个实例变量(numberOfSides),但我需要确保在bounds中正确设置了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;
}

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

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

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

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

-(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;
}

编辑:以下是another SO question,详细介绍了Objective-C中的异常处理。