如何更改 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
用于调试,调试输出中的属性顺序并不重要。
我的结构是 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
用于调试,调试输出中的属性顺序并不重要。