2014-11-27 5 views
7

Wie kann ich einen Alias ​​für eine Funktion in swift erstellen?Swift Funktionsalias

Zum Beispiel

I

LocalizedString("key") 

nennen wollen, und es sollte

NSLocalizedString("key", comment:"") 

nennen sah ich typealias Befehl, aber es sieht aus wie es nur bei den Typen funktioniert.

+0

können Sie eine neue Funktion erstellen, die NSLocalizedString nennen? – kap

+0

Hm, ich frage mich, ob es einen anderen Weg gibt ... wie ein Makro oder etwas zu verwenden – Caipivara

+0

Der 'Kommentar' wird in die lokalisierte Zeichenfolgendatei geschrieben und ist sehr nützlich für den Übersetzer, auch wenn es nur für dich ist. Es macht es leichter sich daran zu erinnern, wofür diese Zeichenfolge gedacht ist. Keine Frage für Ihre Frage. – zisoft

Antwort

15

Funktionen Verschlüsse genannt, so dass Sie nur eine Funktion einer Variablen zuweisen können:

let LocalizedString = NSLocalizedString 

Sie können auch pseudo-Aliase für Klasse/Struktur Methoden erstellen. Jede Methode ist tatsächlich eine statische (Klassen-) Curry-Funktion, die eine Klasseninstanz als ihren ersten Parameter verwendet. So gegeben eine Klasse:

class MyClass { 
    var data: Int 

    init(data: Int) { 
     self.data = data 
    } 

    func test() { 
     println("\(data)") 
    } 
} 

können Sie die test Methode einer Variablen zuweisen:

let test = MyClass.test 

und dann rufen Sie es wie:

var instance = MyClass(data: 10) 
test(instance)() 

UPDATE

Ich habe gerade festgestellt, dass ich ein wichtiges Detail in Ihrer Frage verpasst habe: Sie möchten den Parameter comment ausblenden. Und meine vorgeschlagene Lösung erlaubt das nicht, während @ rintaros Lösung dies tut.

Jedoch habe ich einen anderen Ansatz für diese Verwendung: Ich erstelle eine String Erweiterung eine berechnete Eigenschaft Implementierung:

extension String { 
    var localized: String { 
     return NSLocalizedString(self, comment: "") 
    } 
} 

und dann kann ich es nur für eine beliebige String-Variable oder wörtlichen:

var string = "test_resource" 
string.localized 

"another_resource".localized 
+0

danke! Ich mochte die Erweiterung Idee, aber vielleicht ist es ein wenig erzwungene Verpackung für die Funktion, was denkst du? – Caipivara

+0

@danielgomezrico Nein. Es ist in Ordnung. Stellen Sie nur sicher, diese Funktionen in einer Datei zu kombinieren, in der Sie mehrere String-Methoden zusammenhalten, zB 'String + Util.swift' –

+0

Andererseits, da' NSLocalized' eine globale Methode ist (im Wesentlichen), möchten Sie vielleicht gehen so statt. –

6

Der kürzeste ist:

let LocalizedString = { NSLocalizedString($0, comment:"") } 

Aber es ist eigentlich eine neue func tion. Nur Verpackung NSLocalizedString.


Vielleicht können Sie nicht dokumentierte @transparent Attribut verwenden. Es inlines Funktion Anruf. siehe this topic on Developer Forum.

@transparent LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 

Aber es ist nicht zu empfehlen. Darüber hinaus, solange meine Tests, alle der folgenden Codes schließlich emittieren genau den gleichen LLVM IR-Code mit -O Optimierung.

script1: mit @transparent

import Foundation 
@transparent func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
println(LocalizedString("key")) 

script2: ohne @transparent

import Foundation 
func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
println(LocalizedString("key")) 

Script3: Direkte NSLocalizedString Anruf

import Foundation 
func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
println(NSLocalizedString("key", comment:"")) 

Alle oben genannten sind inline, um direkte NSLocalizedString Aufruf durchzuführen.

Aber der folgende Code sendet anders:

script4: Schließung

import Foundation 
let LocalizedString = { NSLocalizedString($0, comment:"") } 
println(NSLocalizedString("key", comment:"")) 

Einwickeln Es ist auch inlined, aber zusätzliche refcount Anweisung LocalizedString eingeführt wird.

So, wie ein Abschluss, sollten Sie einfach verwenden diese:

func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
+0

Was Männer mit Inlined und Inserted? – Caipivara