我有一个导入的纹理,其名称与表示其状态的变量boolean相同。
let myButtonNameABC = false
有没有办法将此变量的名称转换为String,以便可以用来加载名称相同的图像?
答案 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
切换为false
,false
切换为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的信息。