【发布时间】:2017-04-07 20:40:23
【问题描述】:
我正在尝试在我的应用程序中进行一些复杂的过滤,但我已经到了不知道下一步该做什么的地步。我的数据由一组字典组成,其中每个字典中的值可以是String、Int 或[String]。
let person1: [String : Any] = ["first_name" : "John",
"last_name" : "Smith",
"age" : 21,
"skills" : ["C#", "Java", "Swift"]]
let person2: [String : Any] = ["first_name" : "Kim",
"last_name" : "Smith",
"age" : 28,
"skills" : ["Java", "Swift"]]
let person3: [String : Any] = ["first_name" : "Kate",
"last_name" : "Bell",
"age" : 24,
"skills" : ["C#"]]
var people = [person1, person2, person3]
我让用户选择如何过滤这些数据并创建过滤条件字典。这个字典可以有任意数量的键和值。
let filters: [String : [Any]] = ["age" : [28, 24],
"skills" : ["Java", "Swift"]]
在此示例中,我想显示年龄为 age 28 或 24 并且拥有 Java 或 Swift 的 skills 的人,即 person2
这是我目前所拥有的,但它仅适用于 Int 值:
for (key, values) in filters {
var filteredItems = people.filter {
var match = false
for filterValue in values {
if $0[key] as! Int == filterValue as! Int {
match = true
break
}
else {
match = false
}
}
return match
}
people = filteredItems
}
【问题讨论】:
-
如果您不使用字典来完成对象/结构的工作,您会轻松很多
-
@Alexander 我明白,但在我的应用程序中,数据并不总是相同的,我并不总是知道人员对象中的键是什么。
-
这仍然很容易由具有可选属性的对象/结构建模。从根本上说,您遇到的问题是异构字典的类型擦除。要解决这个问题,最简单的方法是使用具有强类型的数据结构...对象/结构。
-
@Alexander 你能给我一个例子,说明你将如何使用我的示例数据处理对象/结构吗?
-
是的,我一会儿有空