2009-09-14 11 views
29

Chciałbym napisać funkcję w Objective-C, taką jak poniższa, która pobiera zmienną liczbę argumentów i przekazuje te argumenty do +stringWithFormat:. Wiem o vsnprintf, ale to oznaczałoby konwersję "formatu" NSString na C iz powrotem (a także oznaczałoby konwersję formatujących symboli zastępczych w nim również ...). poniżejJak "przekazać" zmienną liczbę argumentów do łańcucha znaków NSString + stringWithFormat:

Kod kompiluje, ale oczywiście nie zachowuje się jak chcę :)

NSString *estr(NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 
    NSString *s = [NSString stringWithFormat:format, args]; 
    va_end(args); 
    return s; 
} 

zasadzie: czy istnieje va_list-friendly wersja metody +stringWithFormat:, czy jest to możliwe, aby napisać?

+0

Wystarczy wykazać, że nie jest to tylko przykład zabawki, chciałbym użyj również tej metody: http://cocoaheads.byu.edu/wiki/different-nslog –

+1

Tak, rzeczywiście! NSLog jest zbyt gadatliwy, sprawia, że ​​czasami trudno go odczytać. Miałem na myśli bardzo prosty sposób internacjonalizacji moich aplikacji ... Chcę napisać coś takiego jak tr (@ "Can not open file% @", filePath); na przykład, i po prostu zwracaj to, co jest, jest (odpowiednio sformatowane) we wczesnych etapach rozwoju, a następnie posiada narzędzie, które znajduje wszystkie wywołania tr(), tworzy potrzebne pliki zasobów dla tłumaczeń z wywołań, które odnalazł, później po prostu przełączam przełącznik, a wywołania tr() faktycznie sprawdzają i tłumaczą wiadomości, które przekazują ... –

Odpowiedz

46

initWithFormat:arguments:

NSString *estr(NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 
    NSString *s = [[[NSString alloc] initWithFormat:format arguments:args] autorelease]; 
    va_end(args); 
    return s; 
} 

oni nie wydają się mieć konstruktora wygoda „stringWith ...” wersję

+0

Rzeczywiście! Bardzo dziękuję, patrzyłem w niewłaściwe miejsce (plus, zapomniałem połączenia z "autorelease"). To działa! –

+5

Masz rację, nie mają odpowiednika w zakresie wygody. Zgłosiłem radar (# 7025084) kilka miesięcy temu, prosząc o dokładną rzecz. Jeśli chcesz korzystać z tej funkcjonalności, zgłoś błąd z poleceniem '+ [NSString stringWithFormat: arguments:]' i odwołaj się do tej liczby Radarów - duplikaty (jest już taka) najlepsi programiści mogą zrobić przy "głosowaniu" na problemy, które uważają za ważny. http://bugreport.apple.com –

+1

Uwaga: Aby uprościć triage, jeśli zgłosisz duplikat błędu, użyj nazwy komponentu "NSString" i wersji "X". Dzięki! –

Powiązane problemy