[英]swift reflection and the any type
我正在嘗試使用快速反射來管理對各種類的屬性的更改。 在操場上進行測試時,我編寫了以下代碼:
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,因此您不能進行該比較。
關於我能做些什么(無論多么復雜)以獲得價值本身或零值的任何想法?
如果添加,則可以看到Any的值為nil的難題:
if thing.value == nil
{
}
在print(thing.value)語句之后。 該錯誤表明Any不能為nil,因此您無法進行比較,但是先前運行的代碼清楚地顯示thing.value為nil。
如果您要做的只是觀察類值的變化,那么ReactiveCocoa就是最好的選擇 。
class SomeClass {
let myBool:MutableProperty<Bool> = MutableProperty(true)
}
您必須將要觀察的每個屬性包裝在MutableProperty
結構中(或根據需要,將其包裝在ConstantProperty
, AnyProperty
等中),然后可以使用包裝器的producer
屬性在值更改時進行觀察。
let object = SomeClass()
object.myBool.producer.on(next: { value in
print(value)
})
您可以使用on
方法將副作用注入到該屬性的觀察中。 有很多事件, interrupted
, completed
, next
等等。
Swift中的反射也相當慢。 為了給您一個想法,請看一下這篇文章 。 本地創建2000個NSManagedObject
實例的速度是其反射副本的3.5倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.