2015-04-01 27 views
10

Mam prosty problem. Próbowałem wyszukiwania w wielu blogach na temat tego pytania, ale wszystkie witryny zwracają jak funkcja w szybkiej pracy, ale potrzebuję tej sprawy.Funkcja Swift z argumentami ... przejście do innej funkcji z argumentami

Moja funkcja jest zwyczaj:

func getLocalizeWithParams(args:CVarArgType...)->String { 
    return NSString.localizedStringWithFormat(self, args); //error: Expected expression in list of expressions 
} 

Jak zrobić, aby przekazać moje argumenty do innych funkcji systemu z argumentami?

Dzięki wcześniej.

+0

możliwie wtórnika [przepuszczanie tablicę funkcji o zmiennej liczbie argumentów Swift ] (http://stackoverflow.com/questions/24024376/passing-an-array-to-a-function-with-variable-number-of-args-in-swift) – newacct

+0

Widziałem ten post, ale tak się nie stało " t rozwiązać mój problem. – ViTUu

+0

Co powiesz na to: http://stackoverflow.com/questions/24110853/passing-in-variable-number-ofgs-from-one-function-to-another-in-swift To dokładnie to samo, co twój problem . Został oznaczony jako duplikat powyższego; dlatego użyłem tego. – newacct

Odpowiedz

15

podobne jak w (Objective-) C, nie można przekazać zmiennej listę argumentów bezpośrednio do innej funkcji. Musisz utworzyć CVaListPointer (odpowiednik Swift z va_list w C) i wywołać funkcję, którą przyjmuje parametr CVaListPointer.

Więc to może być to, czego szukasz:

extension String { 
    func getLocalizeWithParams(args : CVarArgType...) -> String { 
     return withVaList(args) { 
      NSString(format: self, locale: NSLocale.currentLocale(), arguments: $0) 
     } as String 
    } 
} 

withVaList() tworzy CVaListPointer z listy argumentów danej i wywołuje zamknięcie z tego wskaźnika jako argumentu.

Przykład (z dokumentacji NSString):

let msg = "%@: %f\n".getLocalizeWithParams("Cost", 1234.56) 
print(msg) 

wyjście dla amerykańskiego regionalne:

Cost: 1,234.560000 

wyjście dla niemieckiej lokalizacji:

Cost: 1.234,560000 

Update: Na Swift 3/4 można przekazać argumentów

String(format: String, locale: Locale?, arguments: [CVarArg]) 

bezpośrednio:

+0

To działało dobrze dla mnie .. Dziękuję – ViTUu

+0

Studiowałem o va_list, ale nie szukałem nigdzie o tym w swift ... – ViTUu

+0

To nie poprawnie przekształca zlokalizowany ciąg. –

0

Uważam, że niepoprawnie używasz NSString.localizedStringWithFormat(self, args). W przeciwnym razie nic złego w używaniu argumentów do wywoływania innej funkcji.

Jeśli spojrzeć poniżej, należy określić format jako NSString jako pierwszy argument: NSString.localizedStringWithFormat(format: NSString, args: CVarArgType...)

ten SO pytanie wyjaśnia, jak używać go w Swift: iOS Swift and localizedStringWithFormat

+0

Dziękuję, ale wiem, jak działa localizedStringWithFormat, potrzebuję wiedzieć, jak przekazać args ... params do innej funkcji, jak localizedStringWithFormat args ... zrozumieć? Sry my english – ViTUu

+0

Podczas przekazywania argumentów, aby uzyskaćLocalizeWithParams(), możesz użyć tego dla dowolnego wywołania funkcji w ramach tej funkcji. Nic w tym złego. – anasimtiaz

+0

Args ... in ** getLocalizeWithParams() ** to _Array_, moja tablica może zawierać ** n ** elementów, ponieważ to muszę przejść do ** NSString.localizedStringWithFormat ** a ** n ** wartości, i kiedy próbuję w ten sposób, robię, to przekazuje jedną tablicę nie wiele wartości do ** NSString.localizedStringWithFormat ** – ViTUu