不能在带有反射的Swift中动态设置Enum



我正在尝试使用反射和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",所以发生了运行时错误。

最新更新