Swift函数别名

时间:2014-11-27 14:00:40

标签: swift alias

如何在swift中为函数创建别名?

例如

我想打电话

LocalizedString("key")

它应该调用

NSLocalizedString("key", comment:"")

我看到了typealias命令,但它看起来只适用于类型。

2 个答案:

答案 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