将Swift变量名转换为字符串,以用作字符串?

时间:2016-11-20 23:08:11

标签: swift string variables converter

我有一个导入的纹理,其名称与表示其状态的变量boolean相同。

let myButtonNameABC = false

有没有办法将此变量的名称转换为String,以便可以用来加载名称相同的图像?

2 个答案:

答案 0 :(得分:3)

你可以把它变成一个函数而不是一个变量,并做同样的事情。我会逐步解释。

首先,我们如何使函数与变量相同?

基本上,我们将变量“包装”在函数内部。这与我在您最新的RefBool线程中建议的第一个块的方法类似,我们通过函数抓取或设置值。

在这里,我们使用方法/函数直接更改变量而不使用参数 - 因此,我们将按名称使用函数,而不是使用名称变量在整个代码中访问它:

enum Static {
  private static var _button1 = false
  static func button1() { toggle(&_button1) }
}

注意, Enum只是一个命名空间,我们可以调用该方法来强调我们的代码不需要变量的名称 - 只有函数需要知道它的名字。这个代码也可以在结构或类中运行,甚至可以在全局名称空间中运行。

所以,在这里,如果我想更改_button1的值,我必须致电button1() _button1基本上对所有人和所有人都不可见 - 这没关系,因为我们只需要button1()来完成我们的工作。

现在,每当我们致电Static.button1()时,Static._button1都会将true切换为falsefalse切换为true,依此类推(使用我之前给你的功能)

我们为什么要这样做?

好吧,因为没有办法在没有Mirror和反射的情况下获取变量的名称,并且已经有一个名为#function的内置命令。我们正在跳过使用该功能的附加环节,因此我们不必设置镜像和其他OBJc环。

让我们改变我们的enum以演示如何获取func的名称:

 enum Static {
  private static var _button1 = false

  static func button1() -> String { 
    toggle ( &_button1 ) 
    return ( #function )
  }
}

现在,当我们调用button1()时,我们会做两件事:1,我们切换按钮的状态(_button1),然后返回一个名为“button1()”的字符串

let buttonName = Static.button1()  // buttonName = "button1()"

我们可以通过调用String的成员来改变自己,使其更有用:

let trimmedButtonName = Static.button1().replacingOccurrences(of: "()", with: "")
// trimmedButtonName = "button1"

现在让我们用这个方便的替代品更新我们的enum

enum Static {
  private static var _button1 = false

  static func button1() -> String { 
    toggle ( &_button1 ) 
    return ( #function.replacingOccurrences(of: "()", with: "") )
  }
}

我们的最终用例如下:

let buttonName = Static.button1()

注意:

您不必将_button1设为私有,这只是为了证明您 它是公开的。如果你需要获取它的状态,你可以创建另一个函数,或者从button1()返回一个元组类型:

static func button1() -> (name: String, state: Bool) {
// ...        
  return ( #function.etc, _button1)
}

let results = Static.button1()
print( results.name  ) // "button1"
print( results.state ) //  true / false

如果您需要对设置变量进行更明确的控制,也可以在参数中设置一些内容,就像使用任何普通函数一样。

<强>更新

例如,如果您想使用显式控件,则可以执行以下操作:

func button1(equals: Bool? = nil) -> (name: String, state: Bool) {
  if equals != nil {
    // do the code mentioned above
  } else {
    _button1 = equals!
  }

  return (#function.replacingOccurrences(of: "()", with: ""), _button1)
}

let buttonState.state = Static.button1(equals: false) // false
let buttonStateAgain.state = Static.button1(equals: true) // true
print(Static.button1().name) // "button1"

答案 1 :(得分:3)

您可以使用镜像。

struct Test {
    let myButtonNameABC = false
}

let childrens = Mirror(reflecting: Test()).children

childrens.forEach {
    print($0.label ?? "")
}

这将打印:

myButtonNameABC

您可以找到有关镜像here的信息。