- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Swift 2.1 创建一个函数,该函数按键 dateKey 的日期值对字典数组进行排序。
我想将其添加为 Array 类型的扩展,因此我可以使用 someArray.sortDictionariesByDate(dateKey: String, dateFormatter: NSDateFormatter)
extension Array where Element: CollectionType {
mutating func sortDictionariesByDate(dateKey: String, dateFormatter: NSDateFormatter) {
sortInPlace {
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
if let dateStringA: String = ($0 as? [String: AnyObject])?[dateKey] as? String, let dateStringB = ($1 as? [String: AnyObject])?[dateKey] as? String {
if let dateA: NSDate = dateFormatter.dateFromString(dateStringA), dateB: NSDate = dateFormatter.dateFromString(dateStringB) {
return dateA.compare(dateB) == .OrderedAscending
}
}
return false
}
}
}
只要字典的类型为 [String: AnyObject]
就可以正常工作,但是如果我在 [String: String]
类型的字典上使用它不起作用,因为它无法将 String
转换为 AnyObject
。我认为这是因为 String
是 Struct
而不是 Class
。我也尝试将元素类型转换为 [String: Any]
,但是无论使用 [String: AnyObject]
类型的字典还是[字符串:字符串]
。
有没有我可以用来支持键类型为 String
和任何值类型(String
、AnyObject
等)的字典的转换,或者可以添加到扩展中以避免完全转换的 where 子句或协议(protocol)一致性?
编辑:这是根据请求的两个示例数组
var sampleArray1: [[String: AnyObject]] = [["date": "2015-10-24T13:00:00.000Z", "foo": "bar"], ["date": "2015-10-24T14:00:00.000Z", "foo": "bar"]]
sampleArray1.sortDictionariesByDate("date", dateFormatter: NSDateFormatter())
var sampleArray2: [[String: String]] = [["date": "2015-10-24T13:00:00.000Z", "foo": "bar"], ["date": "2015-10-24T14:00:00.000Z", "foo": "bar"]]
sampleArray2.sortDictionariesByDate("date", dateFormatter: NSDateFormatter())
最佳答案
第一个问题:您比较的是字符串,而不是日期。幸运的是,您的字符串格式使其可以直接与字符串及其表示的日期值进行比较。因此,您无需将其转换为 NSDate
完全没有。
第二个问题是类型转换Dictionary<Key,Value1>
至 Dictionary<Key,Value2>
批发不起作用,即使Value1
是covariant在 Value2
.它可能在像这样的小例子中工作......
let a : [String: String] = ["name": "David", "location": "Chicago"]
let b = a as [String: AnyObject]
...因为编译器可以在 String
中看到值类型 ( a
)并通过编译时间优化它。对于像您这样的动态情况,无法提前获得信息。
当你需要活力时,你总是可以回到老 friend Objective-C:
extension Array where Element: CollectionType {
mutating func sortDictionariesByDate(dateKey: String) {
self.sortInPlace {
if let a = $0 as? NSDictionary, b = $1 as? NSDictionary {
return (a[dateKey] as? String) < (b[dateKey] as? String)
} else {
return false
}
}
}
}
// Example:
var sampleArray1: [[String: AnyObject]] = [
["date": "2015-10-24T13:00:00.000Z", "foo": "bar"],
["date": "2015-10-24T14:00:00.000Z", "foo": "bar"],
["date": "2015-10-24T10:00:00.000Z", "foo": "bar"]
]
var sampleArray2: [[String: String]] = [
["date": "2015-10-24T13:00:00.000Z", "foo": "bar"],
["date": "2015-10-24T14:00:00.000Z", "foo": "bar"],
["date": "2015-10-24T10:00:00.000Z", "foo": "bar"]
]
sampleArray1.sortDictionariesByDate("date")
sampleArray2.sortDictionariesByDate("date")
请注意,由于您现在比较的是字符串而不是日期,所以没有 NSDateFormatter
是需要的。
关于arrays - Swift 字典扩展数组 sortInPlace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283919/
我正在尝试制作一个实现纸牌游戏的程序。但是,对一副牌(纸牌阵列)进行排序会产生意想不到的输出。 我的 Card.swift 文件有以下比较函数,它首先排序: // For Comparable pub
我正在尝试使用 Swift 2.1 创建一个函数,该函数按键 dateKey 的日期值对字典数组进行排序。 我想将其添加为 Array 类型的扩展,因此我可以使用 someArray.sortDict
更新到 Xcode 7 后,我的 iOS 应用程序停止编译(由于几次“更改”),但是我想出了一些我不知道如何变得更简单的东西。我需要根据以下三个条件对数组进行排序: appDelega
你好 我有一个字典,其中包含我需要根据时间值 (NSDate) 进行排序的结构。 大多数结构体中不会包含该时间值,因此它们的时间值(NSDate?)将为 nil(可选)。 我尝试的函数在尝试 nil
我正在尝试向 Card 添加两个方法数组,这样我就可以调用 cardArray.suitSort()或cardArray.rankSort()执行sortInPlace({})括号之间具有适当的比较函
我正在尝试对字典中的数组进行排序,但出现错误。这是我试过的代码。我缺少什么以及为什么不能编译? var dict = [Int: [String]]() dict[1] = ["Zack", "Jam
我一直在尝试快速学习核心数据。我有一个数组,其中填充了具有各种属性的 Person 核心数据对象。以下是我遇到问题的属性: @NSManaged var id: Int 在我的托管对象模型中,id 属
我一直在尝试在 swift 中使用 sortInPlace 函数,但它不起作用。当我使用 sort 函数而不是 sortinplace 时,它起作用了。 请解释这两个函数之间的区别。如果您能提供演
我是一名优秀的程序员,十分优秀!