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" 方法。