2017-02-23 3 views
0

Hier ist mein Problem.Swift 3 Graph: FILTER und enthält für Entities

Ich habe eine "allPlayers" Array Entity.

Ich habe eine "Spieler" Beziehung zwischen einem "Team" und einem "allPlayers" -Entitäten.

Ich möchte eine Liste aller Spieler, die noch nicht in diesem Team sind.

So:

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

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

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

    return playersAvailable 
} 

in playersTeam werden die allPlayers in Spieler Beziehung ein Team gegeben werden gespeichert. Dann möchte ich das allPlayers-Array filtern, das nicht das playersTeam enthält.

aber die !playersTeam.contains($0) geben Sie mir einen Fehler. Entität hat keine Methode "enthält". Es hat nur "enthält (wo :)"

Irgendeine Idee?

+1

Sie möchten, dass Ihr Entitätsmodell dem erforderlichen Protokoll entspricht. [Hier] (http://Stackoverflow.com/a/32953118/2227743) Ich habe ein Beispiel (die Frage ist über indexOf, aber es ist das gleiche Problem, das Sie tatsächlich haben). Wenn Sie dieses Beispiel nicht mögen, gibt es natürlich viele andere. ;) // * Oder * du könntest eine Schließung in 'contains (wo:)' verwenden, das würde auch funktionieren. – Moritz

Antwort

1

um Ihre Frage zu beantworten, werde ich Ihr Modell so einrichten, wie ich es verstehe. Lassen Sie uns zuerst unsere Team-Entities einrichten:

let tA = Entity(type: "Team") 
tA["name"] = "A" 

let tB = Entity(type: "Team") 
tB["name" = "B" 

und jetzt einige Player Entities.

let p1 = Entity(type: "Player") 
p1["name"] = "Daniel" 

let p2 = Entity(type: "Player") 
p2["name"] = "Eve" 

Eine Beziehung:

p1.is(relationship: "TeamMember").of(object: ta) 

Jetzt sparen wir es alle:

let graph = Graph() 
graph.sync() 

Jetzt suchen wir für alle Spieler:

let search = Search<Entity>(graph: graph).for(types: "Player") 
let players = search.sync() 

Und jetzt wollen wir alle Spieler, die nicht zu einem Team gehören, whi ch bedeutet, dass sie nicht Teil einer Beziehung mit TeamMember Relationship-Typen sind.

let result = players.filter { (player) -> Bool in 
    return player.relationship(types: "TeamMember").count == 0 
} 

Das sollte es sein. Lass es mich wissen, wenn ich es richtig verstanden habe. Vielen Dank!

0

Fast alles perfekt. Aber ich musste eine Liste der Spieler zurückgeben, die nicht in einem bestimmten Team sind. (A-Spieler Teil von mehreren Teams zur gleichen Zeit sein kann)

Nach mehreren Versuchen habe ich die Art und Weise herausgefunden:

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 
} 

in einem Set Converting playersTeam, konnte ich „enthält“ Methode verwenden.