0

这是我的问题。

我有一个“allPlayers”数组实体。

我在“团队”和“allPlayers”实体之间有“玩家”关系。

我想要一份尚未加入这支球队的所有球员的名单。

所以:

func availablePlayer(_ team:Entity) -> [Entity] {

    let playersTeam = players.filter { $0.subject == team }.flatMap { [$0.object] }

    let playersAvailable = allPlayers.filter { !playersTeam.contains($0) }

    return playersAvailable
}

在playersTeam 中将存储给定团队的玩家关系中的allPlayers。然后,我想过滤不包含 playerTeam 的 allPlayers 数组。

但是!playersTeam.contains($0)给我一个错误。实体没有“包含”方法。它只有“包含(在哪里:)”

任何想法?

4

2 回答 2

2

为了回答你的问题,我会按照我理解的方式设置你的模型。首先让我们设置我们的团队实体:

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
}

应该是这样的。如果我理解正确,请告诉我。谢谢!

于 2017-02-23T16:39:05.497 回答
0

几乎一切都很完美。但是我必须返回一份他们不在特定给定球队中的球员名单。(一个玩家可以同时加入多个团队)

经过几次尝试,我想出了办法:

func availablePlayer(_ team:Entity) -> [Entity] {

    let playersTeam = Set(players.filter { $0.subject == team }.flatMap { [$0.object] })

    let playersAvailable = allPlayers.filter { !playersTeam.contains($0) }

    return playersAvailable
}

在集合中转换 playerTeam,我可以使用“包含”方法。

于 2017-02-24T08:02:17.050 回答