2009-04-13 2 views
7

私は、合成メソッドを使ってオーバーライドしたいセッターメソッド(setMinimumNumberOfSides)を持っています。その中で、intが特定の範囲内にあることを確認するために、インスタンス変数に制約を入れています。セッターメソッドをオーバーライドして情報を取得する

後でカスタムのinitメソッドで別のインスタンス変数(numberOfSides)を設定していますが、minimumNumberOfSidesとmaximumNumberOfSidesが境界内で正しく設定されていることを確認する必要があります。私はセッターの戻り値をBOOLに変更しようとしました。成功したか失敗したかをYESまたはNOに戻すことができましたが、これは競合するメソッドを作成したため、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

ゲッターとセッターの実装を計画している場合は、numberOfSidesを合成する必要はありません。 @synthesize numberOfSidesがなければ、選択した場合はBOOLを返すことができます。それに応じてインタフェース内のgetter/setterを宣言する必要があります。

ところで、別のアプローチは、合成ゲッタ/セッタを使用し、このチェックを実行する別のメソッド-(BOOL)isNumberOfSidesValidを追加することです。

+0

私にそれを打つ。 +1 –

3

このような状況では、assert()への簡単な呼び出しを使用する方が良い場合があります。

このクラスがどのように使用されるかによって、選択肢が異なります。ライブラリの一部になり、他の開発者がminimumNumberOfSidesまたはmaximumNumberOfSidesの間違った値を頻繁に提供することが予想される場合は、おそらく適切な例外をスローする必要があります。

警告の言葉。あなたのアプリケーションのユーザーが頻繁に不正確な値を提供すると予想される場合、例外は悪い考えです。 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; 
} 

編集:ここでははObjective-Cの中の例外処理について詳しく説明しますanother SO questionです。ここは、いくつかの簡単なサンプルコードです。

関連する問題