Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift 3中向我自己的班级施放[String:String]_Swift - Fatal编程技术网

在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,让我来修复它