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