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; 

그리고 나서 문제의 값을 반환하는 사용자 정의 getter를 구현합니다.

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