我正在尝试使用反射和setValue
函数动态克隆Swift中的类对象。这个类包含一个enum
属性,它背后有一个Int
属性,这会导致这个动态反射崩溃:
@objc enum Status : Int {
case green
case yellow
case red
}
@objc class State : NSObject {
@objc var status : Status
init(_ status: Status) {
self.status = status
}
}
func testReflectiveClone() {
let state1 = State(.green)
let state2 = State(.yellow)
let state1Mirror = Mirror(reflecting: state1)
for property in state1Mirror.children.enumerated() {
let label = property.element.label
state2.setValue(property.element.value, forKey: label!) //crashes here
}
}
这个测试函数在XCode中抛出以下错误:
-[__SwiftValue longLongValue]: unrecognized selector sent to instance 0x600001e5a340 (NSInvalidArgumentException)
甚至可以动态设置枚举值吗?我需要做什么修改才能使它工作?
您可以添加rawValue以避免运行时错误。
state2.setValue(property.element.value.rawValue, forKey: label!)
请检查setValue的定义.
open func setValue(_ value: Any?, forKey key: String)
你传递的枚举值将被转移到名为"__SwiftValue"的内部类,编译器发现"状态"是Int enum类型,并试图将其值转换为Swift。Int与"longlongvalue",所以发生了运行时错误。