如何在swift中为函数创建别名?
例如
我想打电话
LocalizedString("key")
它应该调用
NSLocalizedString("key", comment:"")
我看到了typealias
命令,但它看起来只适用于类型。
答案 0 :(得分:17)
函数被命名为闭包,因此您只需将函数赋值给变量:
let LocalizedString = NSLocalizedString
您也可以为类/结构方法创建伪别名。每个方法实际上都是一个静态(类)curried函数,以类实例作为其第一个参数。所以给了一个班级:
class MyClass {
var data: Int
init(data: Int) {
self.data = data
}
func test() {
println("\(data)")
}
}
您可以将test
方法分配给变量:
let test = MyClass.test
然后将其调用为:
var instance = MyClass(data: 10)
test(instance)()
<强>更新强>
我刚刚意识到我错过了您问题中的一个重要细节:您想要隐藏comment
参数。而我提出的解决方案并不允许这样做,而@ rintaro的解决方案确实如此。
但是我使用了不同的方法:我创建了一个实现计算属性的String
扩展:
extension String {
var localized: String {
return NSLocalizedString(self, comment: "")
}
}
然后我可以在任何字符串变量或文字上调用它:
var string = "test_resource"
string.localized
"another_resource".localized
答案 1 :(得分:7)
最短的是:
let LocalizedString = { NSLocalizedString($0, comment:"") }
但是,它实际上是一个新功能。只需包裹NSLocalizedString
。
也许您可以使用未记录的@transparent
属性。它内联函数调用。见this topic on Developer Forum。
@transparent LocalizedString(key:String) -> String {
return LocalizedString(key, comment:"")
}
但不建议这样做。此外,只要我的测试,以下所有代码最终都会通过-O
优化发出完全相同的LLVM IR代码。
script1 :@transparent
import Foundation
@transparent func LocalizedString(key:String) -> String {
return LocalizedString(key, comment:"")
}
println(LocalizedString("key"))
script2 :没有@transparent
import Foundation
func LocalizedString(key:String) -> String {
return LocalizedString(key, comment:"")
}
println(LocalizedString("key"))
script3 :直接NSLocalizedString
来电
import Foundation
func LocalizedString(key:String) -> String {
return LocalizedString(key, comment:"")
}
println(NSLocalizedString("key", comment:""))
以上所有内容都是为了执行直接NSLocalizedString
来电。
但是,以下代码会有所不同:
script4 :关闭包装
import Foundation
let LocalizedString = { NSLocalizedString($0, comment:"") }
println(NSLocalizedString("key", comment:""))
它也是内联的,但是插入了refcount
的{{1}}指令。
因此,作为结论,您应该简单地使用它:
LocalizedString