筛选嵌套结构的数组



我正在寻找一个很好的快速解决方案来解决以下问题:

假设我们有 2 个这样的结构:

struct Person {
let name: String
let age: Int
let skills: Skills
init(name: String, age: Int, skills: Skills) {
self.name = name
self.age = age
self.skills = skills
}
}
struct Skills {
let canUseBow: Bool
let canUseSword: Bool
let canUseShield: Bool
init(canUseBow: Bool, canUseSword: Bool, canUseShield: Bool) {
self.canUseBow = canUseBow
self.canUseSword = canUseSword
self.canUseShield = canUseShield
}
}

现在假设我有一个 Person 数组,其中每个人都有自己的技能,显然腐蚀值可以是真的,也可以是假的。

假设我想要另一组具有技能canUseBow为真的人,以便必须将技能设置为真,我将如何过滤掉没有canUseBow设置为真的人?

我在想一个方向:

filteredPersons = persons.filter {
$0.skills
}

但这样一来,它就需要我而不是在技能之后选择一些东西,例如$0.skills.canUseBow

这似乎不是很面向未来,假设我想添加更多的技能,而不是我还必须再次更改过滤方法。有没有更好的方法可以解决这个问题?

您可以使用可以在简单的Int存储中为您保存所有这些标志的OptionSet来尝试此操作。

import Foundation
struct Person {
let name: String
let age: Int
let skills: Skills
init(name: String, age: Int, skills: Skills) {
self.name = name
self.age = age
self.skills = skills
}
}
struct Skills: OptionSet {
let rawValue: Int
init(rawValue: Int) {
self.rawValue = rawValue
}

static let canUseBow = Skills(rawValue: 1 << 0)
static let canUseSword = Skills(rawValue: 1 << 1)
static let canUseShield = Skills(rawValue: 1 << 2)

init(json: [String: Bool]) {
var skills = Skills(rawValue: 0)
if let canUseBow = json["can_use_bow"], canUseBow {
skills.insert(.canUseBow)
}
if let canUseSword = json["can_use_sword"], canUseSword {
skills.insert(.canUseSword)
}
if let canUseShield = json["can_use_shield"], canUseShield {
skills.insert(.canUseShield)
}
self = skills
}
}

如何实例化Skills

let skills = Skills(json: [
"can_use_bow" : true,
"can_use_sword" : true,
"can_use_shield" : false,
])

如何根据多种技能进行过滤?

let targetSkills: Skills = [.canUseBow, .canUseSword]
let persons: [Person] = []
let filteredPersons = persons.filter { 
targetSkills.isSubset(of: $0.skills)
}

最新更新