簡體   English   中英

快速反射和任何類型

[英]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結構中(或根據需要,將其包裝在ConstantPropertyAnyProperty等中),然后可以使用包裝器的producer屬性在值更改時進行觀察。

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

您可以使用on方法將副作用注入到該屬性的觀察中。 有很多事件, interruptedcompletednext等等。

Swift中的反射也相當慢。 為了給您一個想法,請看一下這篇文章 本地創建2000個NSManagedObject實例的速度是其反射副本的3.5倍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM