我试图将字典转换或转换为对象,但我不知道该怎么做。
这是我的班级:
import Foundation
class DTOStore: NSObject {
var _Id: Int64?
var _StoreId:String?
var _Name:String?
var _Address:String?
var Id: Int64 {
get {
return _Id!
}
set (pValue) {
_Id = pValue
}
}
var StoreId:String {
get {
return _StoreId!
}
set (pValue) {
_StoreId = pValue
}
}
var Name:String {
get {
return _Name!
}
set (pValue) {
_Name = pValue
}
}
var Address:String {
get {
return _Address!
}
set (pValue) {
_Address = pValue
}
}
}
我想做这样的事情:
let vDTOStore:DTOStore = SQLiteConnectionManager.selectRowDatabase(vCommand, pNumColumns: 4) as! DTOStore
其中SQLiteConnectionManager.selectRowDatabase(vCommand,pNumColumns:4)的结果是[String:String]字典,考虑到该函数将被转换为许多不同的对象,这就是为什么它总是返回一个[String] :字符串]
。但是你可以猜测它不起作用,我也不知道该怎么做。
感谢您的帮助。
答案 0 :(得分:4)
您无法强制字典到自定义对象 您需要通过编写适当的初始化程序映射。
您的对象可以缩小为
class DTOStore: NSObject {
let id: Int64
let storeId: String
var name: String
var address: String
init(dictionary: [String:String]) {
self.name = dictionary["name"] ?? ""
self.storeId = dictionary["storeId"] ?? ""
self.address = dictionary["address"] ?? ""
let idString = dictionary["id"] ?? "0"
self.id = Int64(idString) ?? 0
}
var dictionaryRepresentation : [String:String] {
return ["name" : name, "storeId" : storeId, "address" : address, "id" : "\(id)"]
}
}
如果键不存在,则将值设置为空字符串/ 0
id
和storeId
被声明为常量(let
)。
PS:由于字典的来源是SQL数据库,它总是会在所有记录中返回所有请求的字段,如果这些字段被声明为非NULL,那么甚至可以写
init(dictionary: [String:String]) {
self.name = dictionary["name"]!
self.storeId = dictionary["storeId"]!
self.address = dictionary["address"]!
self.id = Int64(dictionary["id"]!)
}
答案 1 :(得分:3)
我将使用struct
(但如果您更喜欢class
,只需将 struct 字替换为 class )。
struct DTOStore {
let id: Int64
let storeId:String
let name:String
let address:String
init?(dict: [String:String]) {
guard
let idString = dict["id"],
let id = Int64(idString),
let storeId = dict["storeId"],
let name = dict["name"],
let address = dict["address"]
else { return nil }
self.id = id
self.storeId = storeId
self.name = name
self.address = address
}
}
DTOStore
有一个可用的初始化程序。
当您想要使用字典或JSON初始化自定义类型的实例时,这非常有用(因为无法保证所有必需的键/值都在那里)。
如果Failable初始化程序接收到不包含所有预期值的字典作为输入,则创建实例 并且初始化程序返回nil
。
答案 2 :(得分:0)
感谢您的所有答案,我最终做到了这一点:
import Foundation
class DTOStore: NSObject {
var _Id = Int64()
var _StoreId = Int64()
var _Name:String = ""
var _Address:String = ""
var _DTOStoreArray = [DTOStore]()
var Id: Int64 {
get {
return _Id
}
set (pValue) {
_Id = pValue
}
}
var StoreId:Int64 {
get {
return _StoreId
}
set (pValue) {
_StoreId = pValue
}
}
var Name:String {
get {
return _Name
}
set (pValue) {
_Name = pValue
}
}
var Address:String {
get {
return _Address
}
set (pValue) {
_Address = pValue
}
}
var DTStoreArrar: [DTOStore] {
get {
return _DTOStoreArray
}
}
init(pValue: [String:String]) {
super.init()
self._Id = Int64(pValue["Id"]!)!
self._StoreId = Int64(pValue["StoreId"]!)!
self._Name = String(pValue["Name"]!)!
self._Address = String(pValue["Address"]!)!
}
init(pArray: [[String:String]]) {
super.init()
for vValue in pArray {
self._DTOStoreArray.append(DTOStore(pValue: vValue))
}
}
}
电话是这样的:
let vDTOStore = DTOStore(pValue: SQLiteConnectionManager.selectRowDatabase(vCommand, pNumColumns: 4))
快乐的编码。