我有一个要导入的纹理,其名称与表示其状态的变量 bool 值相同。
let myButtonNameABC = false
有没有办法将这个变量的名称转换为字符串,以便它可以用于加载同名的图像?
最佳答案
你可以把它变成一个函数而不是一个变量,并做同样的事情。我将分步骤进行解释。
那么首先,我们如何使函数与变量相同?
基本上,我们将变量“包装”在函数内部。这类似于我在您最新的 RefBool 线程中建议的第一个 block 的方法,我们通过函数获取或设置一个值。
在这里,我们使用方法/函数直接更改变量而无需参数——因此,我们将通过名称使用函数而不是通过名称使用变量来在我们的代码中访问它:
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 Static {
private static var _button1 = false
static func button1() -> String {
toggle ( &_button1 )
return ( #function.replacingOccurrences(of: "()", with: "") )
}
}
我们的最终用例如下:
let buttonName = Static.button1()
备注:
您不必将 _button1
设为私有(private),这只是为了证明您不需要将其设为公开。如果你需要获取它的状态,你可以创建另一个函数,或者从 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"
关于swift - 将 Swift 变量名转换为字符串,用作字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40710512/