2011-01-15 5 views
3

[NSString strigWithFormat:format]에 문제가 있습니다. ID를 반환하기 때문에 NSString var을 다른 개인 형식으로 변경 한 코드가 많습니다. 하지만 컴파일러는 NSString이 다른 유형의 객체로 설정 될 곳이 있다는 것을 막지 않습니다.코코아 - 다른 variadic 하나에서 가변 메서드 호출 (NSString stringWithFormat 호출)

NSString의 카테고리를 작성 중이므로 stringWithFormat에 대한 모든 통화를 myStringWithFormat으로 바꿉니다.

코드는 다음과 같습니다

@interface NSString (NSStringPerso) 
+ (NSString*) myStringWithFormat:(NSString *)format; 
@end 



@implementation NSString (NSStringPerso) 
+ (NSString*) myStringWithFormat:(NSString *)format { 
    return (NSString*)[NSString stringWithFormat:format]; 
} 
@end 

컴파일러는 "이 아닌 문자열 리터럴없고 형식 인수 형식"고 알려줍니다.

이 방법을 만드는 방법이 있습니까?

답변

6

NSString으로는 가변 함수로부터 인수 목록 취하는 방법을 포함한다. 이 샘플 기능을 봐 :

void print (NSString *format, ...) { 
    va_list arguments; 
    va_start(arguments, format); 

    NSString *outout = [[NSString alloc] initWithFormat:format arguments:arguments]; 
    fputs([output UTF8String], stdout); 
    [output release]; 

    va_end(arguments); 
} 

그 코드의 일부는 무관하지만, 키 라인은 NSString *output = [[NSString alloc] initWithformat:format arguments:arguments];입니다. 가변성 함수/방법으로 NSString을 생성하는 방법입니다.

+ (NSString *)myStringWithFormat:(NSString *)format, ... { 
    va_list arguments; 
    va_start(arguments, format); 

    NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arguments]; 
    va_end(arguments); 

    // perform some modifications to formattedString 

    return [formattedString autorelease]; 
} 
+0

+1 * this *가 정답입니다. –

1

여기서 Objective-C 전문가는 없지만 stringWithFormat의 원래 메서드 서명에는 줄임표가 포함되어 있으므로 argument 형식으로 자리 표시 자로 대체 할 인수를 전달할 수 있습니다.

편집 : stringWithFormat은 이른바 변이 형 방법이다. 예를 들어 link입니다.

+0

@sm : 귀하의 경우


, 당신의 코드는 다음과 같이 보일 것입니다 위대한,하지만 어떻게 내가 다른 하나에서 가변 메소드를 호출 할 수 있습니까? 표시된 예제를 보완 할 수는 없습니다 ... – Oliver

+1

stringWithFormat에 va_list를 사용하는 대체 버전이 없기 때문에 어차피 볼 수 없습니다. 대신 initWithFormat을 래핑 해보십시오. 또한 이것 좀 봐 : http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c –

+0

그건 사실이 아니야. 'NSString'은'va_list' :'initWithFormat : arguments :'를 사용하는 버전을 가지고 있습니다. [NSString 클래스 참조] (http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html) –

1

도움 주셔서 감사합니다. 참조 문서를 읽으면서 해결책을 찾았습니다!

이 작동 :

을 .H

@interface NSString (NSStringPerso) 
+ (NSString*) strWithFormatPerso:(id)firstObject, ...; 
@end 

에서는하는 .m

@implementation NSString (NSStringPerso) 
+ (NSString*) strWithFormatPerso:(id)firstObject, ... { 

    NSString* a; 

    va_list vl; 
    va_start(vl, firstObject); 
    a = [[[NSString alloc] initWithFormat:firstObject, vl] autorelease]; 
    va_end(vl); 

    return a; 
} 
@end 
+0

그건 나를 위해 일했습니다! – Jaryl

+0

코코아의 규칙 중 두 가지는 "작성했지만 초기화되지 않은 객체에 메시지를 보내지 말 것"과 "객체를 두 번 초기화하지 말 것"입니다.이 두 가지를 피하는 가장 쉬운 방법은 객체를 초기화와 별도로 할당하지 않는 것입니다. 동일한 메시지 표현식에서 NSString 객체를 할당하고 초기화해야합니다. 나는 autorelease를 거기 위로 또한 움직일 것이고, 동일한 선에서 3 개 모두를 할 것이다. 'a '의 선언을'va_start'와'va_end' 사이로 옮기거나 그 자리에두고 이니셜 라이저를 할당으로 나눌 수 있습니다; 그것은 당신의 개인 스타일에 달려 있습니다. –

+0

@Peter Hosey : 어떤 종류의 코드를 제안 하시겠습니까? – Oliver