【问题标题】:Is there a Swift equivalent of C#'s 'nameof()' statement?是否有 Swift 等效于 C# 的“nameof()”语句?
【发布时间】:2016-12-20 10:08:21
【问题描述】:

在 Swift 中,您可以轻松获得枚举案例名称的字符串表示形式,如下所示...

enum Foo
{
    case laa1
    case laa2
    case laa3
}

let varHoldingTheStringLaa1 = String(Foo.laa1) // Returns the string 'laa1'

但是,我不知道如何为班级成员做同样的事情,就像这样......

class Foo
{
    var laa1:String = ""
    var laa2:String = ""
    var laa3:String = ""
}

// None of these work...
let varHoldingTheStringLaa1 = String(laa1)     // Returns the value stored in laa1, not 'laa1'
let varHoldingTheStringLaa1 = String(Foo.laa1) // Won't even compile

在 C# 中,这很容易,感谢nameof。您只需传递您想要这样的字符串表示的成员...

let varHoldingTheStringLaa1 = nameof(laa1) // Returns the string 'laa1'

那么有 Swift 等价物吗?

【问题讨论】:

  • 如果您已经知道属性的名称,为什么不直接分配一个文字,例如:let varHoldingTheStringLaa1 = "laa1"
  • Swift 的反射能力是一项正在进行中的工作,从我所读到的内容来看,甚至不清楚该进展的终点是什么。如果你有兴趣,最近在 swift-evolution 列表中进行了讨论,今年春天。不过目前还没有与nameof()相媲美的操作。
  • Codedifferent,这是因为我试图避免使用 hard.coding 字符串。我也想要重构支持。希望 Swift 会添加它,因为它在 c# 中非常有用,尤其是反射 sdks。

标签: swift reflection introspection


【解决方案1】:

在 Foo 中,您可以像这样使用反射:

let mirror = Mirror(reflecting: self)
let laa1String = mirror[0].0
let laa2String = mirror[1].0

否则当持有 Foo 的实例时,你可以这样使用它:

let fooInstance = Foo()
let mirror = Mirror(reflecting: fooInstance)
let laa1String = mirror[0].0
let laa2String = mirror[1].0

【讨论】:

  • 这些似乎是基于序数的。但是,我已经知道我想要字符串表示的成员。可以将其修改为不使用序数,而是使用成员本身吗? (有关详细信息,请参阅我对以下答案的评论。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2010-09-25
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
相关资源
最近更新 更多