【发布时间】:2023-03-06 14:22:02
【问题描述】:
我正在尝试使用快速反射来管理对各种类的属性的更改。在使用 Playground 进行测试时,我将以下代码放在一起:
class myClass
{
var fieldOne:String?
var fieldTwo:Int?
var fieldThree:Float?
}
var oneMyClass = myClass()
oneMyClass.fieldOne = "blah"
let aMirror = Mirror(reflecting: oneMyClass)
for thing in aMirror.children
{
print(thing.label!)
print(thing.value)
}
这会产生以下输出:
fieldOne
Optional("blah")
fieldTwo
nil
fieldThree
nil
属性名称很棒,但我不想要 Optional,我只想要值,所以当然,我使用以下方法将其拆箱:
print(thing.value!)
返回以下错误除外:
Playground execution failed: /var/folders/blahblahblah...swift:21:22: error:
cannot force unwrap value of non-optional type 'Any' (aka 'protocol<>')
print(thing.value!)
~~~~~~~~~~~^
当它达到 nil 值时。
但是,如果您尝试将 thing.value 与 nil 进行比较,它会告诉您 Any 类型不能为 nil,因此您不能进行该比较。
关于我能做些什么(无论多么复杂)以获得值本身或 nil 的任何想法?
如果您添加,您可以看到 Any 具有 nil 值的困境:
if thing.value == nil
{
}
在 print(thing.value) 语句之后。该错误表明 Any 不能为 nil,因此您无法进行比较,但之前运行的代码清楚地显示 thing.value IS nil。
【问题讨论】:
-
您可以使用github.com/evermeer/EVReflection 来获取所有属性值的干净字典。当使用 EVObject 作为基础对象时,您还可以比较 2 个可以进行字段级评估的对象。您也可以尝试测试 mirror.displayStyle == .Optional 然后获取 mirror.children.first.value
标签: swift reflection