获取Swift变量的实际名称作为字符串

S.H*_*.H. 40 reflection swift

所以我试图在Swift中将实际变量名称作为字符串,但是没有找到方法这样做......或者我可能在一个不好的角度看待这个问题和解决方案.

所以这基本上就是我想做的事情:

var appId: String? = nil

//This is true, since appId is actually the name of the var appId
if( appId.getVarName = "appId"){
    appId = "CommandoFurball"
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法在苹果文档中找到任何与此相近的内容,但是:

varobj.self or reflect(var).summary 
Run Code Online (Sandbox Code Playgroud)

但是,这给出了变量本身内部或变量类型的信息,在这种情况下是String,我想要变量的实际名称.

And*_*rew 48

这在Swift 3中正式支持使用#keyPath()

https://github.com/apple/swift-evolution/blob/master/proposals/0062-objc-keypaths.md

示例用法如下:

NSPredicate(format: "%K == %@", #keyPath(Person.firstName), "Wendy")
Run Code Online (Sandbox Code Playgroud)

Swift 4中,我们有更好的东西:\KeyPath符号

https://github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md

NSPredicate(format: "%K == %@", \Person.mother.firstName, "Wendy")

// or

let keyPath = \Person.mother.firstName
NSPredicate(format: "%K == %@", keyPath, "Andrew")
Run Code Online (Sandbox Code Playgroud)

速记是一个受欢迎的补充,能够从变量引用键路径是非常强大的

  • 关于Swift 4的事我有点困惑.生成的`keyPath`不是直接的String,Objective-C运行时期望谓词的初始化程序.例如,如果`Person`是NSManagedObject的Core Data生成的子类,则这不起作用,因为`keyPath`不能转换为"Objective-C-like"键,即String(或` NSString`).我错过了什么吗? (6认同)
  • 这似乎要求类型扩展NSObject?是否有类似的东西适用于"纯粹的Swift"课程? (5认同)
  • 此示例中的变量名称是什么?它作为字符串发送/给出在哪里? (4认同)
  • 这也仅适用于实际的类和结构属性。它不适用于局部变量或局部常量。 (2认同)

Col*_*inE 27

根据这个答案的更新,它在Swift 3 via中得到支持#keyPath

NSPredicate(format: "%K == %@", #keyPath(Person.firstName), "Andrew")
Run Code Online (Sandbox Code Playgroud)

  • 我错过了什么,或者这不能给出问题的答案,我认为这是'你怎么得到一个变量的名字?例如,如果我有一个名为`foo`的变量(与其类型无关),我认为问题是'如何将字符串"foo"存储在另一个变量中?作为一个例子,这里是你如何在C#中做到的:`string nameOfFoo = nameof(foo);`现在,存储在`nameOfFoo`中的值是字符串"foo" (11认同)

小智 5

这是我的解决方案

class Test { 
    var name: String = "Ido"
    var lastName: String = "Cohen"
}

let t = Test()
let mirror = Mirror(reflecting: t)

for child in mirror.children {
    print(child.label ?? "")
}
Run Code Online (Sandbox Code Playgroud)

打印将

name
lastName
Run Code Online (Sandbox Code Playgroud)