Ios 将任意类型的数据强制转换为Swift中的字符串数组

Ios 将任意类型的数据强制转换为Swift中的字符串数组,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,因此,在使用swift和firebase开发应用程序时,我遇到了一个问题,我有一个表视图,在其中添加数据作为日期,但当我检索它们时,我希望在添加它们时以某种方式对它们进行排序。因此,最后一项将位于最后一个索引。 基本上,我检索一个数据块作为任何类型 Optional({ "-Ly6Njj9vNH_T9umxDwS" = "01-08-2020"; "-Ly6U4vzEAGvIC0Yblnl" = "12-08-2020"; "-Ly6U7_91jW5tajpX7k0" =

因此,在使用swift和firebase开发应用程序时,我遇到了一个问题,我有一个表视图,在其中添加数据作为日期,但当我检索它们时,我希望在添加它们时以某种方式对它们进行排序。因此,最后一项将位于最后一个索引。 基本上,我检索一个数据块作为任何类型

Optional({
    "-Ly6Njj9vNH_T9umxDwS" = "01-08-2020";
    "-Ly6U4vzEAGvIC0Yblnl" = "12-08-2020";
    "-Ly6U7_91jW5tajpX7k0" = "11-08-2020";
    "-Ly6UG6HYqTMq1NaRehI" = "10-08-2020";
})
所以在这里你可以看到它们从上到下被正确地编号,但是当我尝试使用

data as? [String]
它不起作用,我能做到

data as [String: String]

但这并不能保证顺序,我知道我可以添加时间戳之类的东西,但如果我每天都有格式正确的数据,但是任何类型的数据,就必须有一种方法将其转换成数组。

字典没有真正的顺序;打印输出的顺序没有意义,可以更改。我们可以在不参考firebase的情况下复制这一点:

let d : NSDictionary = [
    "-Ly6Njj9vNH_T9umxDwS" : "01-08-2020",
    "-Ly6U4vzEAGvIC0Yblnl" : "12-08-2020",
    "-Ly6U7_91jW5tajpX7k0" : "11-08-2020",
    "-Ly6UG6HYqTMq1NaRehI" : "10-08-2020"
]
print(d)
//{
//    "-Ly6Njj9vNH_T9umxDwS" = "01-08-2020";
//    "-Ly6U4vzEAGvIC0Yblnl" = "12-08-2020";
//    "-Ly6U7_91jW5tajpX7k0" = "11-08-2020";
//    "-Ly6UG6HYqTMq1NaRehI" = "10-08-2020";
//}

let d2 = d as! [String:String]
print(d2)
// ["-Ly6Njj9vNH_T9umxDwS": "01-08-2020", 
   "-Ly6U4vzEAGvIC0Yblnl": "12-08-2020", 
   "-Ly6UG6HYqTMq1NaRehI": "10-08-2020", 
   "-Ly6U7_91jW5tajpX7k0": "11-08-2020"]
所以,如果你想要一个有序的成对列表,你必须使用一个数组,你必须自己排序,大概是使用时间戳。但正如一条评论所说,这个顺序就是钥匙的顺序

let arr = Array(d2).sorted {$0.key < $1.key}
print(arr)
//[(key: "-Ly6Njj9vNH_T9umxDwS", value: "01-08-2020"),
// (key: "-Ly6U4vzEAGvIC0Yblnl", value: "12-08-2020"),
// (key: "-Ly6U7_91jW5tajpX7k0", value: "11-08-2020"),
// (key: "-Ly6UG6HYqTMq1NaRehI", value: "10-08-2020")]

“我知道我可以加上时间戳之类的”太好了,就这么做吧。这里的“顺序”只是一种错觉。@matt实际上,顺序是相关的,因为自动生成的ID内置了一个时间戳组件,它们将按时间顺序进行字典排序。这意味着,如果操作的目的是按照预期的顺序迭代条目,那么OP可以只存储这些ID的排序列表。字典没有顺序。你必须把字典中的键和对象按顺序排列@道格·史蒂文森精彩的观点,谢谢。我对Firebase一无所知,但你知道。:)非常感谢你!你知道钥匙的比例吗?假设我有很多条目,因为我的密钥是childByAutoID,在某个时候,按键排序是否会不起作用,因此我必须实现时间戳/其他方法?我对Firebase一无所知,但Doug Stephenson对您的问题的评论说,自动生成的键是按时间戳字典顺序排列的。@JoseCuevas我只想补充一点信息。我不会依赖钥匙来订购。虽然道格在评论中所说的和这个答案(显然)是100%准确的,但在很多时候,利用它们是行不通的。假设您想要得到日期X和日期Y之间的所有节点,或者如果您想要它们按降序排列呢。还是要对数据进行分页?我建议将日期存储为如下字符串:20200108、20201208、20201108等。这样可以更好地控制加载的数据量(分页)和加载的范围/顺序。
let arr2 = arr.map {$0.value}
print(arr2)
// ["01-08-2020", "12-08-2020", "11-08-2020", "10-08-2020"]