在Swift 3

时间:2017-04-20 14:30:35

标签: swift

我试图将字典转换或转换为对象,但我不知道该怎么做。

这是我的班级:

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] :字符串]

但是你可以猜测它不起作用,我也不知道该怎么做。

感谢您的帮助。

3 个答案:

答案 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 idstoreId被声明为常量(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

  

有关此方法的更多信息https://developer.apple.com/swift/blog/?id=37

答案 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))

快乐的编码。