2009-04-13 38 views
7

我有一個setter方法(setMinimumNumberOfSides),我想在使用合成後重寫。其中,我正在對實例變量進行約束以確保int處於特定範圍內。重寫setter方法,並獲取信息

在後面的自定義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; 
} 

回答

7

如果您打算實施getter和setter,則不必綜合numberOfSides。沒有@synthesize numberOfSides,如果你願意,你可以返回一個BOOL。您需要相應地在界面中聲明getter/setter。

順便說一句,另一種方法是使用合成的getter/setter並添加一個單獨的方法-(BOOL)isNumberOfSidesValid執行此檢查。

+0

打我吧。 +1 – 2009-04-13 20:23:04

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的異常處理的細節。