我需要导入一种名字与代表其状态的布尔变量相同的纹理。
有没有办法将此变量的名称转换为字符串,以便可以使用它来加载同名的图像?
let myButtonNameABC = false
有没有办法将此变量的名称转换为字符串,以便可以使用它来加载同名的图像?
let myButtonNameABC = false
enum Static {
private static var _button1 = false
static func button1() { toggle(&_button1) }
}
因此,在这里,如果我想要改变_button1
的值,我必须调用button1()
。 _button1
实际上对所有人和一切都是不可见的--这没关系,因为我们只需要button1()
来完成我们的工作。
所以现在,每当我们调用Static.button1()
时,Static._button1
将会使用之前给你的函数在true
和false
之间切换。
我们为什么要这样做呢?
因为没有办法在不使用Mirror
和反射的情况下获取变量的名称,而且已经有一个名为#function
的内置命令。我们通过使用函数来跳过设置镜像和其他OBJc难点的步骤。
让我们修改我们的enum
来演示如何获取func
的名称:
enum Static {
private static var _button1 = false
static func button1() -> String {
toggle ( &_button1 )
return ( #function )
}
}
现在,当我们调用 button1()
函数时,会发生两件事情:1. 切换按钮(_button1)的状态;2. 返回一个名为 "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
设置为私有的,这只是为了说明您不需要将其设置为公共的。如果您需要获取它的状态,您可以创建另一个函数或从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"
struct Test {
let myButtonNameABC = false
}
let childrens = Mirror(reflecting: Test()).children
childrens.forEach {
print($0.label ?? "")
}
myButtonNameABC
你可以在这里找到关于Mirror的信息。
NSPredicate(format: "%K == %@", #keyPath(Person.firstName), "Andrew")
但是在这个例子中变量名在哪里,它被发送和存储在哪里呢? - Confused