【问题标题】:swift reflection and the any type快速反射和任何类型
【发布时间】: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。

【问题讨论】:

标签: swift reflection


【解决方案1】:

如果您只想观察类值的变化,请查看ReactiveCocoa

class SomeClass {

    let myBool:MutableProperty<Bool> = MutableProperty(true)

}

您必须将要观察的每个属性包装在 MutableProperty 结构中(或 ConstantPropertyAnyProperty 等,具体取决于您想要什么),然后您可以使用该包装器的 producer 属性观察值何时发生变化。

let object = SomeClass()
object.myBool.producer.on(next: { value in 
    print(value)
})

您使用on 方法将副作用注入到对该属性的观察中。有很多事件,interruptedcompletednext,仅举几例。

Swift 中的反射也相当慢。给你一个想法,看看this article。在本机创建 2000 个 NSManagedObject 实例的速度是其反射对应物的 3.5 倍。

【讨论】:

  • 不幸的是,我正在寻找的更改不是实时的。将修改后的值作为块发送到服务器是一个延迟的过程。这可能有效,但它似乎比我希望的要复杂。
  • 我了解,使用 RC 绝对可以实现类似的操作。而且它可能比反射 b/c 更好,您将 100% 知道变量的类型。
  • 原谅我的无知,什么是“RC”?
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多