2017-08-21 4 views
0

無視されたプロパティを使用し、単純な迅速プロパティを使用する動作の違いは何ですか?無視されたプロパティと単純な迅速なプロパティ

DBに保存すべきではない領域オブジェクトにプロパティを追加する必要があります。レルムは「無視されたプロパティ」を提供しますが、通常のスウィフトスタイルでプロパティを書き込むだけの場合は、DBに保存しないでください。行動に違いはありますか?

// Ignored propery 
class Person: Object { 
    dynamic var tmpID = 0 

    override static func ignoredProperties() -> [String] { 
    return ["tmpID"] 
    } 
} 


// Normal swift property 
class Person: Object { 
     var tmpID = 0 // Realm supported class but with no dynamic 
     var myClassObj = MyCustomClass() // Class realm does not support 
} 

答えて

1

あなたはdynamic

  • ことなく、これら二つのもの

    • 迅速な財産で第一種のレルム

    でサポートされていない型であるプロパティをignoredPropertiesを比較する電子ているように見えます、レルムはまだこれらをデータベースに保存しているようです。

    class MyObject: Object { 
        dynamic var string = "" 
        var normalString = "" 
    } 
    

    そしてデータベース:

    enter image description here

    dynamicプロパティを動的に更新することを可能にするObjective-Cランタイムに動的ディスパッチを使用するように迅速に指示するだけの方法だからです実行時に第二種については

    、レルムは、レルムObjectのではないカスタムクラスを無視しているようです。

  • +0

    これが受け入れ答えですが、私はスウィフト4と、この動作を見ていないのですが、レルム3の答えに示すように、レルムクラスのプロパティは、VARとして指定されている場合、レルムはそれを永続化するためには表示されません(それを保存します)をレルムに追加する。 Swift 4についても注意してください.Realmプロパティは@objc dynamic varとして定義する必要があります – Jay

    1

    はそれをレルムの道を行い、ignoredPropertiesを使用するための他の理由があって、私が、私が見る一つの問題は、次のようになります。

    レルムはC++プロジェクトで、上記のObjective-Cレイヤーがあり、その上にSwiftレイヤーがあります。ある日、Objective-Cレイヤーが削除される可能性が高いと思います。 dynamicは、Objective-Cの動的ディスパッチを使用するようにコンパイラに指示するため、その日後にデータベースをアップグレードすると、すべての簡単なプロパティがデータベースエントリになります。 Objective-Cレイヤを削除すると、dynamicは必要なくなります。したがって、保存してignoredPropertiesを使用してください。

    2

    Realmモデルのvarプロパティは、Realmフレームワークで使用されるObjective-Cランタイムのためにdynamicとする必要があります。プロパティをdynamicとマークしないと、実行時に更新されません。

    ただし、ignoredPropertiesは完全に独立したものです。 ignoredPropertiesにプロパティを追加することにより、Realmにそのプロパティをデータベースに保持しないように指示します。プロパティをdynamicとマークしないで、ignoredPropertiesに追加しない場合でも、それはRealmに永続化されますが、期待どおりに機能しません。

    あなたが永続化するためにされていない、あなたのレルムモデルクラスのプロパティを格納する必要がある場合は、ignoredPropertiesにそれらを追加する必要があります。

    関連する問題