2017-02-23 1 views
0

여기 내 문제가 있습니다.스위프트 3 그래프 : 엔티티에 대한 필터 및 포함

"allPlayers"배열 엔터티가 있습니다.

"팀"과 "allPlayers"엔티티 사이에 "선수"관계가 있습니다.

아직이 팀에 속하지 않은 모든 플레이어의 목록을 원합니다.

그래서 : playersTeam에서

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

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

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

    return playersAvailable 
} 

는 팀 주어진 선수 관계에 allPlayers을 저장됩니다. 그러면 playersTeam이 포함되지 않은 allPlayers 배열을 필터링하려고합니다.

그러나 !playersTeam.contains($0)은 오류입니다. 엔터티에 "contains"메서드가 없습니다. "contains (where :)"

어떤 아이디어가 있습니까?

+1

엔티티 모델이 필요한 프로토콜을 따르도록하고 싶습니다. [Here] (http://stackoverflow.com/a/32953118/2227743) 나는 예제를 가지고있다. (질문은 indexOf에 관한 것이지만, 실제로 당신과 같은 문제이다.) 이 예제가 마음에 들지 않는다면 많은 다른 것들이 있습니다. ;) // * 또는 *'contains (where :)'에 클로저를 사용할 수있다. 이것은 또한 작동 할 것이다. – Moritz

답변

1

질문에 대답하려면 모델을 이해하는 방식으로 설정하겠습니다. 먼저 팀 엔티티를 설정해 보겠습니다.

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

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

이제 일부 플레이어 엔티티가 있습니다.

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

을 그리고 지금 우리가 원하는 :

let graph = Graph() 
graph.sync() 

이제 우리는 모든 플레이어를 검색 :

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

이제 우리는 모든 것을 저장합니다

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

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

관계를 만들기 팀의 일원이 아닌 선수, whi ch는 TeamMember Relationship 유형과의 관계에 속하지 않음을 의미합니다.

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

그래야합니다. 내가 제대로 이해하면 알려줘. 고맙습니다!

0

거의 모든 것이 완벽합니다. 그러나 특정 팀에 속하지 않은 플레이어 목록을 반환해야했습니다. 가 여러 번 시도 후

(A 플레이어가 동시에 여러 팀의 일부가 될 수 있습니다), 내가 길을 알아 낸 : 내가 사용할 수있는 설정에 playersTeam 변환

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 
} 

을 방법 "할 수 있습니다."