Xcode 按字典中的NSDates对字典数组进行排序
我正在创建一个包含单独帖子的应用程序(类似于Instagram)。每个帖子都是一个大数组中的字典。在每本词典中,它们都有一个NSDate,我想按照从最新到最旧的顺序对词典进行排序 我读过类似的问题,但它们在目标C中。我觉得Xcode 按字典中的NSDates对字典数组进行排序,xcode,swift,nsarray,nsdate,nsdictionary,Xcode,Swift,Nsarray,Nsdate,Nsdictionary,我正在创建一个包含单独帖子的应用程序(类似于Instagram)。每个帖子都是一个大数组中的字典。在每本词典中,它们都有一个NSDate,我想按照从最新到最旧的顺序对词典进行排序 我读过类似的问题,但它们在目标C中。我觉得NSSortDescriptor是一种有用的方法,但不确定在这种情况下如何使用它 任何帮助都会很好 谢谢如果您使用的是Swift,您可能会发现使用Swift数组类型([ContainedType])比使用NSArray更容易。除其他外,排序Swift数组比使用NSSortDes
NSSortDescriptor
是一种有用的方法,但不确定在这种情况下如何使用它
任何帮助都会很好
谢谢如果您使用的是Swift,您可能会发现使用Swift数组类型(
[ContainedType]
)比使用NSArray
更容易。除其他外,排序Swift数组比使用NSSortDescriptor
等更简单
NSDates可以使用进行比较。比较如下:
let d1 = NSDate()
let d2 = NSDate()
d1.compare(d2) == .OrderedAscending
但您可能更希望他们实现可比的
协议,可以这样做:
extension NSDate: Comparable { }
public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.isEqualToDate(rhs)
}
public func <(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.compare(rhs) == .OrderedAscending
}
// now you can do
d1 > d2
d1 <= d2 //etc
但也就是说,此时您可能想考虑将数据存储为适当的数据结构,而不是作为内容字典:
struct Post {
let timestamp: NSDate
// and various other properties...
}
let posts: [Post] = [
Post(timestamp: d1),
Post(timestamp: d2)
]
posts.sorted { $0.timestamp < $1.timestamp }
因此,在进行比较时,取出日期字符串,然后使用格式化程序将其转换为NSDate
,然后比较结果
注意,这使用了flatMap
–这是因为dateFromString
本身返回一个可选的,而您不需要可选的,因此需要展平结果
这样做的最大缺点是没有检测到无效日期。如果其中的日期格式不正确(例如,月和日的顺序错误),dateFromString
将返回nil
,并将其排序到数组的开头
另一个缺点是它变得非常低效。在进行此类处理之前,最好将数据转换为更结构化的形式(例如,带有NSDate
-类型化成员变量的struct
)。如果使用Swift编写,可能会发现使用Swift数组类型([ContainedType]
)比使用NSArray
更容易。除其他外,排序Swift数组比使用NSSortDescriptor
等更简单
NSDates可以使用进行比较。比较如下:
let d1 = NSDate()
let d2 = NSDate()
d1.compare(d2) == .OrderedAscending
但您可能更希望他们实现可比的
协议,可以这样做:
extension NSDate: Comparable { }
public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.isEqualToDate(rhs)
}
public func <(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.compare(rhs) == .OrderedAscending
}
// now you can do
d1 > d2
d1 <= d2 //etc
但也就是说,此时您可能想考虑将数据存储为适当的数据结构,而不是作为内容字典:
struct Post {
let timestamp: NSDate
// and various other properties...
}
let posts: [Post] = [
Post(timestamp: d1),
Post(timestamp: d2)
]
posts.sorted { $0.timestamp < $1.timestamp }
因此,在进行比较时,取出日期字符串,然后使用格式化程序将其转换为NSDate
,然后比较结果
注意,这使用了flatMap
–这是因为dateFromString
本身返回一个可选的,而您不需要可选的,因此需要展平结果
这样做的最大缺点是没有检测到无效日期。如果其中的日期格式不正确(例如,月和日的顺序错误),dateFromString
将返回nil
,并将其排序到数组的开头
另一个缺点是它变得非常低效。在进行此类处理之前,您最好将数据转换为更结构化的形式(例如,带有NSDate
类型的成员变量的struct
),谢谢您的详细回答!但是,我确实有一个问题-数组中包含的所有字典都是。这意味着当我的NSDate到达排序部分时,它是一个字符串。警告引起了我的注意-从NSString到NSDate的转换总是失败(除非格式正确)。我该如何着手解决这个问题呢?非常感谢您的详尽回答!但是,我确实有一个问题-数组中包含的所有字典都是。这意味着当我的NSDate到达排序部分时,它是一个字符串。警告引起了我的注意-从NSString到NSDate的转换总是失败(除非格式正确)。我该如何着手解决这个问题?
let dicts: [[String:String]] = [["Date":"May 20 20015"], ["Date":"May 20 2014"]]
let fmt = NSDateFormatter()
fmt.dateStyle = .MediumStyle
let sortedDicts = dicts.sorted { lhs, rhs in
lhs["Date"].flatMap(fmt.dateFromString) < rhs["Date"].flatMap(fmt.dateFromString)
}