swift - 简化 Swift 数据结构
问题描述
有关如何简化此数据结构的任何建议?数据将保存为用户驱动器上的字典,当我从驱动器读取数据时,我必须将它们转换回Member
以便轻松访问属性。
我想让它类型安全。
struct Member {
var id: Int
var firstname: String
var lastname: String
var address: String?
var zipCode: Int?
var city: String?
enum Value: String {
case id = "id"
case firstname = "firstname"
case lastname = "lastname"
case address = "address"
case zipCode = "zipCode"
case city = "city"
}
var member: [String:Any] {
return [
Value.id.rawValue:Int(),
Value.firstname.rawValue:firstname,
Value.lastname.rawValue:lastname,
Value.address.rawValue:address ?? String(),
Value.zipCode.rawValue:zipCode ?? Int(),
Value.city.rawValue:city ?? String()
]
}
}
func memberToDic(member: Member) -> [String:Any] {
return [
Member.Value.firstname.rawValue:member.firstname,
Member.Value.lastname.rawValue:member.lastname,
Member.Value.address.rawValue:member.address ?? String(),
Member.Value.zipCode.rawValue:member.zipCode ?? Int(),
Member.Value.city.rawValue:member.city ?? String()
]
}
func dicToMember(dic: [String:Any]) -> Member {
return Member(
id: dic[Member.Value.id.rawValue] as! Int,
firstname: dic[Member.Value.firstname.rawValue] as! String,
lastname: dic[Member.Value.lastname.rawValue] as! String,
address: dic[Member.Value.address.rawValue] as? String,
zipCode: dic[Member.Value.zipCode.rawValue] as? Int,
city: dic[Member.Value.city.rawValue] as? String
)
}
解决方案
几乎可以肯定,这是正确的实现:
struct Member: Codable {
var id: Int
var firstName: String // "first name" is two words, so capitalize "name"
var lastName: String
var address: String // "No address" should be empty, not nil
var zipCode: String // ZIP codes are not integers
var city: String // "No city" should be empty, not nil
}
为了将其保存为 plist,请使用 PropertyListEncoder:
let data = try PropertyListEncoder().encode(member)
要阅读它,请使用 PropertyListDecoder。
Codable 会自动为您的属性创建键映射,因此不需要 Value。
您应该强烈避免创建或使用[String: Any]
字典。这些存在主要是由于 Objective-C 接口无法生成强类型。
如果address
,zipCode
和city
all 应该设置在一起,或者不设置在一起,那么您应该将它们收集到一个结构中:
struct Address: Codable {
var streetAddress: String
var zipCode: String
var city: String
}
struct Member: Codable {
var id: Int
var firstName: String // "first name" is two words, so capitalize "name"
var lastName: String
var address: Address?
}
在这种情况下,Optional 是有意义的,因为“空”与“缺失”不同。
推荐阅读
- thread-safety - 停止 IMFSourceReader 时,如何确保不会再次调用 OnReadSample?
- python - 如何使用re从python中的字符串中删除包含模式
- itext - 加载静态内容 pdf2Html Itext 7
- php - 它如何用 Laravel 中的 api 替换所有数据库功能
- sql - 了解此查询中的位置
- oracle - 通过 toad 连接到私有子网中的 Aws RDS
- sql - X时间后如何删除一些记录或文件 - Laravel 5
- sapui5 - 如何正确绑定异步。将数据从新闻 API 加载到视图并将数据显示为内容?
- node.js - Mongodb $addFields,从函数返回字段值?
- python-3.x - 我将如何在 python 3.x 中重写这个 wget post 语句?