Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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中处理json中不同类型的元组_Json_Swift_Date_Tuples - Fatal编程技术网

在Swift中处理json中不同类型的元组

在Swift中处理json中不同类型的元组,json,swift,date,tuples,Json,Swift,Date,Tuples,我想保存一个元组数组,其中一个元素是值,另一个元素是Swift 3中的日期 下面是一些硬编码的示例 var currentDateTime = NSDate() var confArray: [(conf: Int, date: NSDate)] = [] confArray.append((4, currentDateTime.addingTimeInterval(60 * 60 * 24 * -15))) confArray.append((3, currentDateTime.addi

我想保存一个元组数组,其中一个元素是值,另一个元素是Swift 3中的日期

下面是一些硬编码的示例

var currentDateTime = NSDate()

var confArray: [(conf: Int, date: NSDate)] = []

confArray.append((4, currentDateTime.addingTimeInterval(60 * 60 * 24 * -15)))
confArray.append((3, currentDateTime.addingTimeInterval(60 * 60 * 24 * -7)))
confArray.append((3, currentDateTime))
confArray.append((1, currentDateTime.addingTimeInterval(60 * 60 * 24 * 1)))
confArray.append((5, currentDateTime.addingTimeInterval(60 * 60 * 24 * 2)))
confArray.append((3, currentDateTime.addingTimeInterval(60 * 60 * 24 * 3)))
然而,JSON似乎不允许元组,当我这样做时会抛出一个错误

let trackingContent = ["key": confArray ]
let jsonData = try JSONSerialization.data(withJSONObject: trackingContent, options: JSONSerialization.WritingOptions())
有办法解决这个问题吗

我考虑过将这两个元素转换成字符串,并将它们保存为字符串数组。然而,将日期转换为字符串需要多行,我必须将其转换回。 请告诉我是否有更有效的方法在JSON中存储元组,或者我是否遗漏了什么。谢谢

我们来玩吧

import Foundation

typealias Conf = (idx: Int, interval: TimeInterval)
typealias JSConf = [String]

extension Array where Element == Conf {
    func encode() -> JSConf {
        return map { "\($0.idx):\($0.interval)" }
    }

    static func decode(_ jsConf: JSConf) -> [Conf] {
        return jsConf.map({ e -> Conf in
            let comps = e.components(separatedBy: ":")
            return (Int(comps.first!)!, Double(comps.last!)!)
        })
    }
}

var confs: [Conf] = []
confs.append((4, 60 * 60 * 24 * -15))
confs.append((3, 60 * 60 * 24 * -7))
confs.append((3, 0))
confs.append((1, 60 * 60 * 24 * 1))
confs.append((5, 60 * 60 * 24 * 2))
confs.append((3, 60 * 60 * 24 * 3))

let encode = confs.encode()

let data = ["key": encode]
do {
    let _ = try JSONSerialization.data(withJSONObject: data, options: JSONSerialization.WritingOptions())
} catch {
    print(error.localizedDescription)
}

let decode = [Conf].decode(encode)

print(decode)
希望这有帮助

我们来玩吧

import Foundation

typealias Conf = (idx: Int, interval: TimeInterval)
typealias JSConf = [String]

extension Array where Element == Conf {
    func encode() -> JSConf {
        return map { "\($0.idx):\($0.interval)" }
    }

    static func decode(_ jsConf: JSConf) -> [Conf] {
        return jsConf.map({ e -> Conf in
            let comps = e.components(separatedBy: ":")
            return (Int(comps.first!)!, Double(comps.last!)!)
        })
    }
}

var confs: [Conf] = []
confs.append((4, 60 * 60 * 24 * -15))
confs.append((3, 60 * 60 * 24 * -7))
confs.append((3, 0))
confs.append((1, 60 * 60 * 24 * 1))
confs.append((5, 60 * 60 * 24 * 2))
confs.append((3, 60 * 60 * 24 * 3))

let encode = confs.encode()

let data = ["key": encode]
do {
    let _ = try JSONSerialization.data(withJSONObject: data, options: JSONSerialization.WritingOptions())
} catch {
    print(error.localizedDescription)
}

let decode = [Conf].decode(encode)

print(decode)

希望这有帮助

为什么要使用数组类型?我的建议是将
confArray
转换为
[Int:[NSDate]]
您也可以使用时间戳(timeintervalnce1970)而不是NSDate。它可以很容易地转换回Date@DaoNguyenint值不是唯一的,因此必须是
[NSDate:int]
[[int:NSDate]]]
。在第二种情况下,是否可能在不知道值的情况下获取日期?我需要订购confArray,以便访问第3个元素中的日期、第5个元素中的值等@Woof谢谢!使用时间间隔是有意义的。我正在考虑使用Date而不是NSDate,但是如果我必须在字符串和NSDate之间切换,NSDate似乎更好。@DaoNguyen在使用JSON时不能使用Int作为字典键,因为它必须是字符串。为什么要使用数组类型?我的建议是将
confArray
转换为
[Int:[NSDate]]
您也可以使用时间戳(timeintervalnce1970)而不是NSDate。它可以很容易地转换回Date@DaoNguyenint值不是唯一的,因此必须是
[NSDate:int]
[[int:NSDate]]]
。在第二种情况下,是否可能在不知道值的情况下获取日期?我需要订购confArray,以便访问第3个元素中的日期、第5个元素中的值等@Woof谢谢!使用时间间隔是有意义的。我在考虑使用Date而不是NSDate,但是如果我必须在字符串和NSDate之间切换,NSDate似乎更好。@DaoNguyen在使用JSON时不能使用Int作为字典键,它必须是字符串。哇,谢谢!我将从现在开始把时间间隔改为1970年的时间间隔,我想这正是我想要的!哇,谢谢!我将从现在开始把时间间隔改为1970年的时间间隔,我想这正是我想要的!