2009-05-16 4 views
13

안녕하세요, 여기에 빠른 질문이 있습니다. 나는 간단한 대답이있을 것이라고 확신한다. 내가 정렬 매개 변수가 작성되지 않았습니다Objective-C 기본 인수 값

function myFunction ($array, $sort = FALSE) { 

} 

함수가 false의 기본 값을 계속 : PHP에서 오는

는,이 같은 기본 인수 값으로 함수를 선언 사용 해요 . Obj-C에서 비슷한 점이 있습니까?

필자는 "Programming In Objective-C 2.0"의 연습 문제를 해결하기 위해 분수를 줄이지 않고 분수를 줄이기 위해 분수 클래스 인쇄 함수를 다시 작성하길 원하지만 TRUE 값 감소가 주어지면, 진행하고 분수를 줄인 다음 인쇄하십시오. 이 장 (이 책의 어디에도 없음)에서는 이에 대한 정보를 제공합니다. 당신의 도움들에 대한

감사합니다 : D

+0

중복 : http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c-2-0 –

답변

1

아니, 기본 인수는 C++이 아닌 C 또는 목표 - C의 기능입니다.

function myFunction ($array, $sort) 

function myFunction ($array) 
// call myFunction($array, FALSE) 
+0

실제로, 아니, 그게 C++이기 때문에 그렇게 할 수 없다. ism ... –

24

기본 인수 자체 오브젝티브 C에 존재하지 않는 : 당신이 목표 - C에서해야 할 것입니다 무엇

은 (위의 사이비 코드를 사용하여) 다음이다. 인수 카운트가 메서드 이름과 불가분하게 연결되어 있기 때문에 실제로는 불가능합니다. 각 콜론은 하나의 인수에 해당합니다.

Objective-C 프로그래머는 기본 값으로 채워진 인수가있는 "기본"메서드를 호출하는 "편리한"메서드를 만들어 비슷한 목표를 달성합니다. 예를 들어, -[NSArray indexOfObject:]inRange: 부분에 대해 NSMakeRange(0, [self count])의 인수로 -[NSArray indexOfObject:inRange:]의 버전으로 구현 될 수 있습니다.

그러나이 경우 귀하의 책에 대해 언급하지는 않습니다. 나는 단순히 reduce: 인수에 대해 YES가 주어지면 소수를 줄이는 것을 의미하며 NO가 주어지면 그것을 줄이지 않는다고 생각합니다.

9

원하는 것을 얻기위한 두 가지 표준 패턴이 있습니다.

(1) 메소드의 많은 인수 양식을 작성한 다음 인수 용이성 버전을 적게 제공하십시오. 예를 들어,있는 NSString에 다음과 같은 방법을 고려하십시오

- (NSComparisonResult)compare:(NSString *)string; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask 
      range:(NSRange)compareRange; 
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask 
      range:(NSRange)compareRange locale:(id)locale; 

처음 세 개념적이다 [가능성 구체적으로, 내가 확인하지 않은 제 4 버전을 통해 전화로 구현. -compare : calls -compare : options : range : locale : 3 개의 추가 인수에 대해 적절한 기본값을 사용합니다.

(2) 다른 패턴은 메서드의 많은 인수 버전을 구현하고 인수가 NULL/nil이거나 기본값이 필요함을 나타내는 값으로 설정된 경우 기본값을 제공하는 것입니다. NSData에는이 패턴으로 구현 된 메서드가 있습니다. 예를 들면 : 당신이 readOptionsMask 인수에 0을 전달하면

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask 
      error:(NSError **)errorPtr; 

은을 NSData는 내부적으로 정의 된 기본 구성을 사용하여 파일의 내용을 읽습니다. 기본 구성은 시간이 지남에 따라 변경 될 수 있습니다.

8

이 질문은 매우 오래된,하지만 경우에 사람은 PHP 코드의 목표 - C 버전 아마이 같은 것 (이 가정은 클래스 내에)를 찾습니다

-(id)myFunction:(NSArray*)array { 
    return [self myFunction:array withSort:FALSE]; 
} 

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort { 
    // CODE 
} 

내가 사용 (id)는 PHP 코드에 데이터 유형 정보가 없기 때문에 사용됩니다. (id)를 실제 데이터 유형으로 바꾸는 것이 현명 할 것입니다.

+0

굉장하고 똑똑하다. –

4

끔찍한 necro하지만 이것에 대해봤을 때, Xcode 4.5는 (Clang을 통해) __attribute__((overloadable))으로 C 함수 오버로드를 지원합니다.

오버로드 된 함수의 인수 개수가 다를 수 있으므로 C 함수가 필요한 작업에 적합하면 기본 인수 값을 가져올 수 있습니다. 여기

은 모두 PrintNum라는, 두 가지 기능을 가진 .H 파일의 인위적인 예입니다 : 속성을 지정해야합니다

__attribute__((overloadable)) 
void PrintNum(NSNumber *number) { 
    PrintNum(number, 10); 
} 

__attribute__((overloadable)) 
void PrintNum(NSNumber *number, NSUInteger base) { 
    // ... 
} 

하는 것으로 :

// Prints a number in the decimal base 
__attribute__((overloadable)) extern void PrintNum(NSNumber *number); 

// Prints a number in the specified base 
__attribute__((overloadable)) extern void PrintNum(NSNumber *number, NSUInteger base); 

과하는 .m 파일에

함수의 모든 정의와 선언.

+0

감사합니다.이 팁을 좋아합니다. – xhan

0

#define을 사용하면 쉽게 동일한 효과를 얻을 수 있습니다.

예 :

헤더 파일에 함수 :

+ (있는 NSDate *) getDateFromYear : (NSUInteger) 년 월 : (NSUInteger) 월 일 : (NSUInteger) 일;

헤더 파일에 매개 변수 기능을위한 '#DEFINE'를 추가

#DEFINE GetDateFromYearOnly (년) [YourClassName getDateFromYear : 년 월 : 1 일 : 1]

다음

당신 같은 기능을 사용할 수 있습니다 : NSDate * 2015Date = GetDateFromYearOnly (2015);

그리고 날짜 2015/01/01의 NSDate 개체가 생성됩니다.

함수가 정적이 아닌 경우 다음과 같은 새 함수를 빌드하십시오. - (NSDate *) GetDateFromYearOnly : (NSUInteger) year; 그리고 전화 : [자기 getDateFromYear : 년 월 : 1 일 : 1]