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

How to change Swift structures properties order?

我的结构是 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"

我不是 100% 确定,但我希望转储的格式与您的结构相同

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

//Dump
~Name
~Email

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

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

关键是,你应该绝对将自己与结构的内存布局隔离开来。它们的布局可以在 Swift 的任何未来版本中更改,您不希望它破坏您的程序。

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

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

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

虽然这是一个糟糕的想法,但您可以通过添加自定义 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 用于调试,调试输出中的属性顺序并不重要。