Swift 3 图:实体的过滤和包含
Swift 3 Graph: FILTER and CONTAINS for Entities
这是我的问题。
我有一个 "allPlayers" 数组实体。
我在 "team" 和 "allPlayers" 实体之间有 "players" 关系。
我想要一份所有不在这个团队中的球员的名单。
所以:
func availablePlayer(_ team:Entity) -> [Entity] {
let playersTeam = players.filter { [=11=].subject == team }.flatMap { [[=11=].object] }
let playersAvailable = allPlayers.filter { !playersTeam.contains([=11=]) }
return playersAvailable
}
in playersTeam 将存储 allPlayers in players relationship given a team。
然后,我想过滤不包含playersTeam的allPlayers数组。
但是 !playersTeam.contains([=12=])
给我一个错误。
实体没有 "contains" 方法。
它只有 "contains(where:)"
有什么想法吗?
为了回答您的问题,我将按照我理解的方式设置您的模型。首先让我们设置我们的团队实体:
let tA = Entity(type: "Team")
tA["name"] = "A"
let tB = Entity(type: "Team")
tB["name" = "B"
现在还有一些玩家实体。
let p1 = Entity(type: "Player")
p1["name"] = "Daniel"
let p2 = Entity(type: "Player")
p2["name"] = "Eve"
建立关系:
p1.is(relationship: "TeamMember").of(object: ta)
现在我们全部保存:
let graph = Graph()
graph.sync()
现在我们搜索所有玩家:
let search = Search<Entity>(graph: graph).for(types: "Player")
let players = search.sync()
现在我们需要所有不属于团队的球员,这意味着他们不属于任何 TeamMember 关系类型的关系。
let result = players.filter { (player) -> Bool in
return player.relationship(types: "TeamMember").count == 0
}
应该是这样。让我知道我是否理解正确。谢谢!
几乎一切都很完美。
但是我必须 return 一份他们不在特定给定团队中的球员名单。
(一个球员可以同时是多个球队的一员)
经过几次尝试,我想出了办法:
func availablePlayer(_ team:Entity) -> [Entity] {
let playersTeam = Set(players.filter { [=10=].subject == team }.flatMap { [[=10=].object] })
let playersAvailable = allPlayers.filter { !playersTeam.contains([=10=]) }
return playersAvailable
}
在 Set 中转换 playersTeam,我可以使用 "contains" 方法。
这是我的问题。
我有一个 "allPlayers" 数组实体。
我在 "team" 和 "allPlayers" 实体之间有 "players" 关系。
我想要一份所有不在这个团队中的球员的名单。
所以:
func availablePlayer(_ team:Entity) -> [Entity] {
let playersTeam = players.filter { [=11=].subject == team }.flatMap { [[=11=].object] }
let playersAvailable = allPlayers.filter { !playersTeam.contains([=11=]) }
return playersAvailable
}
in playersTeam 将存储 allPlayers in players relationship given a team。 然后,我想过滤不包含playersTeam的allPlayers数组。
但是 !playersTeam.contains([=12=])
给我一个错误。
实体没有 "contains" 方法。
它只有 "contains(where:)"
有什么想法吗?
为了回答您的问题,我将按照我理解的方式设置您的模型。首先让我们设置我们的团队实体:
let tA = Entity(type: "Team")
tA["name"] = "A"
let tB = Entity(type: "Team")
tB["name" = "B"
现在还有一些玩家实体。
let p1 = Entity(type: "Player")
p1["name"] = "Daniel"
let p2 = Entity(type: "Player")
p2["name"] = "Eve"
建立关系:
p1.is(relationship: "TeamMember").of(object: ta)
现在我们全部保存:
let graph = Graph()
graph.sync()
现在我们搜索所有玩家:
let search = Search<Entity>(graph: graph).for(types: "Player")
let players = search.sync()
现在我们需要所有不属于团队的球员,这意味着他们不属于任何 TeamMember 关系类型的关系。
let result = players.filter { (player) -> Bool in
return player.relationship(types: "TeamMember").count == 0
}
应该是这样。让我知道我是否理解正确。谢谢!
几乎一切都很完美。 但是我必须 return 一份他们不在特定给定团队中的球员名单。 (一个球员可以同时是多个球队的一员)
经过几次尝试,我想出了办法:
func availablePlayer(_ team:Entity) -> [Entity] {
let playersTeam = Set(players.filter { [=10=].subject == team }.flatMap { [[=10=].object] })
let playersAvailable = allPlayers.filter { !playersTeam.contains([=10=]) }
return playersAvailable
}
在 Set 中转换 playersTeam,我可以使用 "contains" 方法。