2014-11-27 14 views
7

Jak mogę utworzyć alias dla funkcji w trybie szybkiego?Alias ​​funkcji Swift

Na przykład

chcę zadzwonić

LocalizedString("key") 

i powinien zadzwonić

NSLocalizedString("key", comment:"") 

widziałem polecenia typealias ale wygląda na to, że działa tylko dla typów.

+0

można utworzyć nową funkcję, która będzie nazywać NSLocalizedString? – kap

+0

Hm, zastanawiałem się, czy istnieje inny sposób ... jak użycie makra lub czegoś. – Caipivara

+0

"Komentarz" jest umieszczany w zlokalizowanym pliku tekstowym i jest bardzo przydatny dla tłumacza, nawet jeśli jest tylko dla ciebie. Ułatwia to zapamiętanie, do czego przeznaczony jest ten ciąg. Ale nie jest to odpowiedź na twoje pytanie. – zisoft

Odpowiedz

15

Funkcje są nazwane zamknięcia, więc można po prostu przypisać funkcję do zmiennej:

let LocalizedString = NSLocalizedString 

Można tworzyć pseudo-aliasy metod klasa/struct również. Każda metoda jest faktycznie statyczną (klasową) funkcją curried, przyjmującą instancję klasy jako jej pierwszy parametr. Tak więc biorąc pod uwagę klasę:

class MyClass { 
    var data: Int 

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

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

można przypisać metodę test do zmiennej:

let test = MyClass.test 

a następnie wywołać ją jako:

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

UPDATE

Właśnie zdałem sobie sprawę, że przegapiłem jeden ważny szczegół w pytaniu: chcesz ukryć parametr comment. A moje proponowane rozwiązanie na to nie pozwala, podczas gdy rozwiązanie @ rintaro ma.

jednak użyć innego podejścia do tego: tworzę String rozszerzenie wykonawczych właściwość wyliczona:

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

i wtedy można po prostu zadzwonić na dowolnym ciągiem zmiennej lub dosłownym:

var string = "test_resource" 
string.localized 

"another_resource".localized 
+0

dzięki! Spodobał mi się pomysł na rozszerzenie, ale może to trochę wymuszone zawijanie do funkcji, jak myślisz? – Caipivara

+0

@danielgomezrico Nie. W porządku. Wystarczy połączyć te funkcje w pliku, w którym trzymasz kilka metod String razem, np. 'String + Util.swift' –

+0

Z drugiej strony, ponieważ' NSLocalized' jest metodą globalną (zasadniczo), możesz chcieć iść w ten sposób zamiast tego. –

6

najkrótsza z nich jest:

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

Ale to faktycznie nowa func tację. Po prostu opakowanie NSLocalizedString.


Może można użyć atrybutu @transparent nieudokumentowane. Powoduje wywołanie funkcji. patrz this topic on Developer Forum.

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

Ale nie jest to zalecane. Co więcej, tak długo jak moje testy, wszystkie następujące kody ostatecznie emitują dokładnie ten sam kod LLVM IR z optymalizacją -O.

script1: z @transparent

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

script2: bez @transparent

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

Script3: Bezpośredni NSLocalizedString wezwanie

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

Wszystkie powyższe są przeznaczone do wykonywania bezpośredniego połączenia NSLocalizedString.

Ale poniższy kod emituje różne:

script4: Zamknięcie owijania

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

Jest również włączonych, ale dodatkowe refcount dyspozycja LocalizedString jest włożona.

Więc Podsumowując, należy po prostu użyć tego:

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

Co robicie z wstawionymi i wstawionymi? – Caipivara