Swift函数别名

Dan*_*ico 10 alias swift

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

例如

我想打电话

LocalizedString("key")
Run Code Online (Sandbox Code Playgroud)

它应该打电话

NSLocalizedString("key", comment:"")
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*nio 18

函数被命名为闭包,因此您只需将函数赋值给变量:

let LocalizedString = NSLocalizedString
Run Code Online (Sandbox Code Playgroud)

您也可以为类/结构方法创建伪别名.每个方法实际上都是一个静态(类)curried函数,以类实例作为其第一个参数.所以给了一个课:

class MyClass {
    var data: Int

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

    func test() {
        println("\(data)")
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将test方法分配给变量:

let test = MyClass.test
Run Code Online (Sandbox Code Playgroud)

然后将其调用为:

var instance = MyClass(data: 10)
test(instance)()
Run Code Online (Sandbox Code Playgroud)

UPDATE

我刚刚意识到我错过了你问题中的一个重要细节:你想要隐藏comment参数.我提议的解决方案不允许这样做,而@ rintaro的解决方案确实如此.

但是我使用不同的方法:我创建一个String实现计算属性的扩展:

extension String {
    var localized: String {
        return NSLocalizedString(self, comment: "")
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以在任何字符串变量或文字上调用它:

var string = "test_resource"
string.localized

"another_resource".localized
Run Code Online (Sandbox Code Playgroud)


rin*_*aro 7

最短的是:

let LocalizedString = { NSLocalizedString($0, comment:"") }
Run Code Online (Sandbox Code Playgroud)

但是,它实际上是一个新功能.只是包装NSLocalizedString.


也许你可以使用未记录的@transparent属性.它内联函数调用.在开发者论坛上查看此主题.

@transparent LocalizedString(key:String) -> String {
    return LocalizedString(key, comment:"")
}
Run Code Online (Sandbox Code Playgroud)

但不建议这样做.此外,只要我的测试,以下所有代码最终都会通过-O优化发出完全相同的LLVM IR代码.

script1:with@transparent

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

script2:没有@transparent

import Foundation
func LocalizedString(key:String) -> String {
    return LocalizedString(key, comment:"")
}
println(LocalizedString("key"))
Run Code Online (Sandbox Code Playgroud)

script3:直接NSLocalizedString调用

import Foundation
func LocalizedString(key:String) -> String {
    return LocalizedString(key, comment:"")
}
println(NSLocalizedString("key", comment:""))
Run Code Online (Sandbox Code Playgroud)

以上所有内容都是为了执行直接NSLocalizedString呼叫.

但是,以下代码会发出不同的代码:

script4:关闭包装

import Foundation
let LocalizedString = { NSLocalizedString($0, comment:"") }
println(NSLocalizedString("key", comment:""))
Run Code Online (Sandbox Code Playgroud)

它也是内联的,但插入了附加refcount指令LocalizedString.

所以,作为结论,你应该简单地使用这个:

func LocalizedString(key:String) -> String {
    return LocalizedString(key, comment:"")
}
Run Code Online (Sandbox Code Playgroud)