将字典数组中的字符串转换为 NSDate
Converting String into NSDate in array of dictionaries
我正在用 API 做一些请求 returns 给我下面的示例 :
[{
id = 1004;
"planning_id" = 7;
"started_on" = "2015-05-14";},
{
id = 1380;
"planning_id" = 8;
"started_on" = "2015-05-16";},
{
id = 1382;
"planning_id" = 8;
"started_on" = "2015-05-18"; }]
如您所见,日期值作为字符串返回,目前被视为 AnyObject...
我现在正尝试为数组的所有字典更改它,以便我可以将 started_on 值用作 NSDate
这是我的代码:
for i in 1..<myArray.count
{
let dateString = shiftsArray[i-1].objectForKey("started_on") as! String
//format date
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
var dateFromString = dateFormatter.dateFromString(dateString)
shiftsArray[i-1].objectForKey("started_on") = dateFromString
}
但是,我无法 运行 代码,因为最后一行有错误:"Cannot assign a value of type 'NSDate?' to a value of type "AnyObject?"。
问题是我不知道如何更改字典 'started_on' 的值类型。
提前谢谢你,
我不知道你在这个小片段之前是如何设置的,但我是这样做的:
var arr:[[String:AnyObject]] = [["id":1, "planning_id":2, "started_on":"2015-05-13"], ["id":1, "planning_id":2, "started_on":"2015-05-14"], ["id":1, "planning_id":2, "started_on":"2015-05-10"]]
for (i, dict) in enumerate(arr) {
let dateString = dict["started_on"] as! String
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let date = formatter.dateFromString(dateString)
arr[i]["started_on"] = date
}
// You mentioned that you want to sort it based on date:
arr.sort { obj1, obj2 -> Bool in
let date1 = obj1["started_on"] as! NSDate
let date2 = obj2["started_on"] as! NSDate
return date1.compare(date2) == NSComparisonResult.OrderedAscending
}
之前:
var myArray = [
[
"id" : 1004,
"planning_id" : 7,
"started_on" : "2015-05-14"
],
[
"id" : 1380,
"planning_id" : 8,
"started_on" : "2015-05-16"
],
[
"id" : 1382,
"planning_id" : 8,
"started_on" : "2015-05-18"
]
]
之后:
[{
id = 1004;
"planning_id" = 7;
"started_on" = "2015-05-14 07:00:00 +0000";
}, {
id = 1380;
"planning_id" = 8;
"started_on" = "2015-05-16 07:00:00 +0000";
}, {
id = 1382;
"planning_id" = 8;
"started_on" = "2015-05-18 07:00:00 +0000";
}]
如果您想就地完成,可以使用此代码:
请参阅下面我的编辑。
我个人希望将更改复制到一个新数组中,在这种情况下您可以使用地图:
let newArray = myArray.map { (var obj) -> AnyObject in
if let dateString = obj["started_on"] as? String {
//format date
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateFromString = dateFormatter.dateFromString(dateString)
obj["started_on"] = dateFromString
return obj
}
return elem
}
编辑
根据您的评论,这里有一个更改日期的示例:
var myArray: [[String:NSObject]] = [
[
"id" : 1004,
"planning_id" : 7,
"started_on" : "2015-05-14"
],
[
"id" : 1380,
"planning_id" : 8,
"started_on" : "2015-05-16"
],
[
"id" : 1382,
"planning_id" : 8,
"started_on" : "2015-05-18"
]
]
for (index, var elem) in myArray.enumerate() {
if let dateString = elem["started_on"] as? String {
//format date
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateFromString = dateFormatter.dateFromString(dateString)
elem["started_on"] = dateFromString
myArray[index] = elem
}
}
访问更改后的数组:
// Returns value in an NSDate
let nsdate = myArray[0]["started_on"]! // It's an optional!
我正在用 API 做一些请求 returns 给我下面的示例 :
[{
id = 1004;
"planning_id" = 7;
"started_on" = "2015-05-14";},
{
id = 1380;
"planning_id" = 8;
"started_on" = "2015-05-16";},
{
id = 1382;
"planning_id" = 8;
"started_on" = "2015-05-18"; }]
如您所见,日期值作为字符串返回,目前被视为 AnyObject...
我现在正尝试为数组的所有字典更改它,以便我可以将 started_on 值用作 NSDate
这是我的代码:
for i in 1..<myArray.count
{
let dateString = shiftsArray[i-1].objectForKey("started_on") as! String
//format date
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
var dateFromString = dateFormatter.dateFromString(dateString)
shiftsArray[i-1].objectForKey("started_on") = dateFromString
}
但是,我无法 运行 代码,因为最后一行有错误:"Cannot assign a value of type 'NSDate?' to a value of type "AnyObject?"。
问题是我不知道如何更改字典 'started_on' 的值类型。
提前谢谢你,
我不知道你在这个小片段之前是如何设置的,但我是这样做的:
var arr:[[String:AnyObject]] = [["id":1, "planning_id":2, "started_on":"2015-05-13"], ["id":1, "planning_id":2, "started_on":"2015-05-14"], ["id":1, "planning_id":2, "started_on":"2015-05-10"]]
for (i, dict) in enumerate(arr) {
let dateString = dict["started_on"] as! String
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let date = formatter.dateFromString(dateString)
arr[i]["started_on"] = date
}
// You mentioned that you want to sort it based on date:
arr.sort { obj1, obj2 -> Bool in
let date1 = obj1["started_on"] as! NSDate
let date2 = obj2["started_on"] as! NSDate
return date1.compare(date2) == NSComparisonResult.OrderedAscending
}
之前:
var myArray = [
[
"id" : 1004,
"planning_id" : 7,
"started_on" : "2015-05-14"
],
[
"id" : 1380,
"planning_id" : 8,
"started_on" : "2015-05-16"
],
[
"id" : 1382,
"planning_id" : 8,
"started_on" : "2015-05-18"
]
]
之后:
[{
id = 1004;
"planning_id" = 7;
"started_on" = "2015-05-14 07:00:00 +0000";
}, {
id = 1380;
"planning_id" = 8;
"started_on" = "2015-05-16 07:00:00 +0000";
}, {
id = 1382;
"planning_id" = 8;
"started_on" = "2015-05-18 07:00:00 +0000";
}]
如果您想就地完成,可以使用此代码:
请参阅下面我的编辑。
我个人希望将更改复制到一个新数组中,在这种情况下您可以使用地图:
let newArray = myArray.map { (var obj) -> AnyObject in
if let dateString = obj["started_on"] as? String {
//format date
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateFromString = dateFormatter.dateFromString(dateString)
obj["started_on"] = dateFromString
return obj
}
return elem
}
编辑
根据您的评论,这里有一个更改日期的示例:
var myArray: [[String:NSObject]] = [
[
"id" : 1004,
"planning_id" : 7,
"started_on" : "2015-05-14"
],
[
"id" : 1380,
"planning_id" : 8,
"started_on" : "2015-05-16"
],
[
"id" : 1382,
"planning_id" : 8,
"started_on" : "2015-05-18"
]
]
for (index, var elem) in myArray.enumerate() {
if let dateString = elem["started_on"] as? String {
//format date
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateFromString = dateFormatter.dateFromString(dateString)
elem["started_on"] = dateFromString
myArray[index] = elem
}
}
访问更改后的数组:
// Returns value in an NSDate
let nsdate = myArray[0]["started_on"]! // It's an optional!