2017-06-19 5 views
2

私の場合、構造はUserです。スウィフト構造のプロパティの順序を変更するには?

プロパティを持つ構造の例(例として、プロパティはわずかです)。

struct User { 
    var name:String? 
    var email:String? 
} 

は、今私は、フィールドの特定の順序(電子メール、名)と User構造体を作成しています。

​​

ここでは、プロパティの順序を確認するために構造のdumpを行っています。

dump(user) 

▿ __lldb_expr_21.User 
    ▿ name: Optional("Oleg") 
    - some: "Oleg" 
    ▿ email: Optional("[email protected]") 
    - some: "[email protected]" 

だから、性質が、私はそれらを追加したのと同じ順序であることをご注文の構造を変更することは可能でしょうか?または、配列を使用してプロパティの順序を保存する必要がありますか?

dump

期待される結果は次のとおりです。

▿ __lldb_expr_25.User 
    ▿ email: Optional("[email protected]") 
    - some: "[email protected]" 
    ▿ name: Optional("Oleg") 
    - some: "Oleg" 
+3

'User'は2つの*プロパティ*を持ち、値をどの順序で割り当てるかは関係ありません。それはなぜでしょうか? - また、 'dump()'は* debugging *のためのもので、プロパティを出力する特定の順序に頼るべきではありません。 –

+0

@MartinRユーザ構造は、実際のプロジェクトで20以上のプロパティを持っています。私が記述する方法で構造のプロパティのシーケンスをログに記録する必要がある場合、レガシープロジェクトに問題があります。 –

+2

注文が重要なのはなぜですか?順序は、構造体の定義で定義されている順序になります。何らかの理由で、構造体の各インスタンスにプロパティが設定されている順序を維持する必要がある場合は、適切な配列とプロパティオブザーバを追加して順序を保存できます。 –

答えて

4

メモリレイアウト構造体のアルゴリズムはまだ具体的に決定されていない。それはSR-3723で追跡されます。それは非常によく、様々な理由のために、将来変更される可能性があります

    コンパイラは、アライメントの制約を満たすためのパディングで無駄に少ないメモリで、その結果、順序を維持に拘束されていない場合
  • メンバーはより緊密に、パックすることができ
  • メンバーが近い点である

一般的な操作のためのより良い地域(したがって、より優れたキャッシュ・パフォーマンス)のためにパックすることができ、あなたは絶対に構造体のメモリレイアウトから自分を隔離する必要があります。 Swiftの将来のバージョンでレイアウトが変更される可能性があります。

コメントから、あなたの問題は、構造体のメモリレイアウトとはまったく関係がないように思われます。これはひどいアイデアですが、

struct User { 
    let name: String 
    let email: String 
} 

extension User: CustomStringConvertible { 
    var description: String { 
     return "your custom description" 
    } 
} 
+0

@Alexnder素晴らしい説明。 –

0

私は100%確実ではないが、私はダンプが同じ形式であることを期待するあなたの構造体として

struct User { 
    var name:String? 
    var email:String? 
} 

//Dump 
~Name 
~Email 
1

をカスタムMirror追加することにより、dumpの出力を修正することができます:これは、あなたが自分自身を定義することができるものです

extension User : CustomReflectable { 
    var customMirror: Mirror { 
     let children = DictionaryLiteral<String, Any>(
      dictionaryLiteral: ("email", self.email as Any), ("name", self.name as Any) 
     ) 

     return Mirror(User.self, children: children) 
    } 
} 

dumpをデバッグし、オーダーするためのものですデバッグ出力のプロパティの値は本当に重要ではありません。

関連する問題