2017-06-19 37 views
2

我的结构在我的情况下是User如何更改Swift结构属性的顺序?

具有属性的示例结构(例如,它只有几个属性)。

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

'用户'有两个*属性*,并且无论您按何种顺序为其分配值。为什么要这样? - 另外'dump()'用于*调试*,你不应该依赖它打印属性的特定顺序。 –

+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是为调试和秩序在调试输出中的属性应该无关紧要。