Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
Xcode 按字典中的NSDates对字典数组进行排序_Xcode_Swift_Nsarray_Nsdate_Nsdictionary - Fatal编程技术网

Xcode 按字典中的NSDates对字典数组进行排序

Xcode 按字典中的NSDates对字典数组进行排序,xcode,swift,nsarray,nsdate,nsdictionary,Xcode,Swift,Nsarray,Nsdate,Nsdictionary,我正在创建一个包含单独帖子的应用程序(类似于Instagram)。每个帖子都是一个大数组中的字典。在每本词典中,它们都有一个NSDate,我想按照从最新到最旧的顺序对词典进行排序 我读过类似的问题,但它们在目标C中。我觉得NSSortDescriptor是一种有用的方法,但不确定在这种情况下如何使用它 任何帮助都会很好 谢谢如果您使用的是Swift,您可能会发现使用Swift数组类型([ContainedType])比使用NSArray更容易。除其他外,排序Swift数组比使用NSSortDes

我正在创建一个包含单独帖子的应用程序(类似于Instagram)。每个帖子都是一个大数组中的字典。在每本词典中,它们都有一个NSDate,我想按照从最新到最旧的顺序对词典进行排序

我读过类似的问题,但它们在目标C中。我觉得
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)
}