2017-01-07 8 views
1

"Circle"クラスの "pi"という名前のインスタンス変数を作成し、その値を3.14に設定して、一度変更することはできません。また、Circleクラスを継承するクラスもpi変数を取得します毎回値。Objective Cで定数インスタンス変数を設定する方法は?

マイコード:

#import <Foundation/Foundation.h> 

@interface Circle: NSObject 

{ 

const double pi = 3.14; 

} 


@property float radius; 

-(float) area; 

-(float) perimeter; 

@end 

答えて

1

それが特定のインスタンスに固有のものではありません何かが本当にないなら、私はclassプロパティ(またはクラスメソッド)を使用する場合があります:

@property (class, readonly) double pi; 

そして私問題の値を返すカスタムゲッターを実装する:

+ (double)pi { 
    return M_PI; 
} 

また、それは一度だけ計算していますので、複雑な計算をVED、あなたはdispatch_onceパターンを使用することがあります:

+ (double)pi { 
    static dispatch_once_t once; 
    static double _pi = 0; 

    dispatch_once(&once, ^{ 
     // an unnecessary complicated calculation of pi, just to illustrate we'll do this only once 

     int k = 1; 
     double previous = 0; 
     BOOL sign = TRUE; 
     do { 
      previous = _pi; 
      _pi = previous + 4.0 * (sign ? 1.0 : -1.0)/k; 
      k += 2; 
      sign = !sign; 
     } while (fabs(_pi - previous) > 0.0001); 
    }); 

    return _pi; 
} 

そして、あなたはこのpiプロパティを参照することができます。

- (float)area { 
    return self.radius * self.radius * [Circle pi]; 
} 

- (float)perimeter { 
    return self.radius * [Circle pi] * 2.0; 
} 
関連する問題