如何更改Swift结构属性顺序?

时间:2017-06-19 07:41:08

标签: swift struct dump

我的结构是User

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

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

现在我正在使用字段的特定顺序(电子邮件,名称)创建User结构。

var user = User()
user.email = "Oleg@gmail.com"
user.name = "Oleg"

现在我正在对dump结构进行查看属性顺序。

dump(user)

▿ __lldb_expr_21.User
  ▿ name: Optional("Oleg")
    - some: "Oleg"
  ▿ email: Optional("Oleg@gmail.com")
    - some: "Oleg@gmail.com"

那么是否可以将结构属性顺序更改为与我添加它们的顺序相同?或者我应该使用Array来保存属性顺序吗?

dump的预期结果是:

▿ __lldb_expr_25.User
  ▿ email: Optional("Oleg@gmail.com")
    - some: "Oleg@gmail.com"
  ▿ name: Optional("Oleg")
    - some: "Oleg"

3 个答案:

答案 0 :(得分:4)

结构的内存布局算法尚未具体确定。它在SR-3723中被跟踪。由于各种原因,未来很可能会发生变化:

    如果编译器不限于保留顺序,则
  • 成员可以更紧密地打包,从而减少填充中用于满足对齐约束的内存浪费
  • 成员可以密切打包,以便为常用操作提供更好的位置(从而提高缓存性能)

关键是,你应该完全将自己与结构的内存布局隔离开来。他们的布局可以在任何未来版本的Swift中改变,你不希望这会破坏你的程序。

从评论中,你的问题似乎与结构的内存布局完全无关,而是它们在记录它们时变量的显示方式。您可以自己定义:

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

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

答案 1 :(得分:1)

虽然这是一个糟糕的想法,但您可以通过添加自定义dump来修改Mirror的输出:

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用于调试,调试输出中的属性顺序并不重要。

答案 2 :(得分:0)

我不是100%肯定,但我希望转储的格式与结构

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

//Dump
~Name
~Email