gpt4 book ai didi

arrays - Swift 字典扩展数组 sortInPlace

转载 作者:行者123 更新时间:2023-11-28 11:13:42 24 4
gpt4 key购买 nike

我正在尝试使用 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。我认为这是因为 StringStruct 而不是 Class。我也尝试将元素类型转换为 [String: Any] ,但是无论使用 [String: AnyObject] 类型的字典还是[字符串:字符串]

有没有我可以用来支持键类型为 String 和任何值类型(StringAnyObject 等)的字典的转换,或者可以添加到扩展中以避免完全转换的 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>批发不起作用,即使Value1covariantValue2 .它可能在像这样的小例子中工作......

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com