在Swift 3中向我自己的班级施放[String:String]
我正在尝试将字典强制转换或转换为对象,但我不确定如何执行 这是我的班级:在Swift 3中向我自己的班级施放[String:String],swift,Swift,我正在尝试将字典强制转换或转换为对象,但我不确定如何执行 这是我的班级: import Foundation class DTOStore: NSObject { var _Id: Int64? var _StoreId:String? var _Name:String? var _Address:String? var Id: Int64 { get { return _Id! }
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
let vDTOStore = DTOStore(pValue: SQLiteConnectionManager.selectRowDatabase(vCommand, pNumColumns: 4))
其中SQLiteConnectionManager.selectRowDatabasevCommand、pNumColumns:4的结果是[String:String]字典,考虑到函数将被强制转换为许多不同的对象,这就是为什么它总是返回[String:String]字典的原因
但是你可以猜到它不起作用,我也不知道怎么做
谢谢您的帮助。您不能将字典强制转换为自定义对象。
您需要通过编写适当的初始值设定项来映射它
您的对象可以简化为
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被声明为常量
PS:由于字典的源是一个SQL数据库,它将始终返回所有记录中所有请求的字段,如果字段声明为非空,您甚至可以写入
init(dictionary: [String:String]) {
self.name = dictionary["name"]!
self.storeId = dictionary["storeId"]!
self.address = dictionary["address"]!
self.id = Int64(dictionary["id"]!)
}
我将使用struct,但如果您喜欢类,请将struct单词替换为class
失败初始化器
DTOStore有一个可失败的初始值设定项
当您希望使用字典或JSON初始化自定义类型的实例时,这非常有用,因为不能保证所有必需的键/值都在那里
如果可失败的初始值设定项接收到一个字典作为输入,该字典不包含所有预期值,则实例未创建,初始值设定项返回nil
有关此方法的更多信息,请参见此处
多亏了你的回答,我终于做到了:
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 = SQLiteConnectionManager.selectRowDatabase(vCommand, pNumColumns: 4) as! DTOStore
let vDTOStore = DTOStore(pValue: SQLiteConnectionManager.selectRowDatabase(vCommand, pNumColumns: 4))
愉快的编码。除了问题之外,在Swift中使用备份实例变量是绝对不寻常的。为什么这些实例变量是可选的?它们永远不会为零。什么时候会有一个没有id的商店,商店id是不同的?、名称或地址?也许应该有一种互惠的方法,可以为您提供DTOStore的字典表示。我知道这不是您的要求,但我也会将这些变量中的大部分转换为let:D storeId或id似乎不太可能更改。感谢您的改进,rmaddy和FogMeister此代码无法处理id属性为Int64类型但字典仅包含字符串的事实。@rmaddy Oops,让我来修复它