2016-10-16 10 views
-1

스위프트 배열에 객체의 특정 인스턴스가 포함되어 있는지 확인하는 방법은 무엇입니까? 이 간단한 예제를 고려하십시오스위프트 배열에 객체의 인스턴스가 포함되어 있는지 확인하십시오.

class Car {} 

let mazda = Car() 
let toyata = Car() 

let myCars = [mazda, toyata] 

myCars.contains(mazda) // ERROR! 

내 조사가 Car 클래스는 Equatable 프로토콜을 채택해야 결론을 내게 할 수있다.

class Car: Equatable { 
    static func ==(lhs: Car, rhs: Car) -> Bool { 
     return true 
    } 
} 

다음 myCars.contains(mazda) 실제로 true를 반환 않습니다 경우 것 같다.

그러나 ==의 구현은 분명히 내가 원하는 것이 아닙니다. 내가 정말로 돌려 주길 바란 것은 질문에 대한 대답입니다 : lhsrhs은 같은 Car 인스턴스입니까?

정말 그렇게 복잡한가요?

감사합니다.

+0

* "lhs와 rhs는 같은 Car 인스턴스입니까?"- 아니요, 질문은 "lhs와 rhs가 동일한 동등한 자동차입니까?"라는 질문을해야합니다. 그들은 똑같아지기 위해 똑같은 존재 일 필요는 없습니다. – rmaddy

+0

아니, 그건 내가 원하는 것이 아니야. 내 경우에는 (자동차가있는 장난감 사례가 아닌), 나는 그들이 실제로 같은 경우인지 알고 싶다. 어쨌든 문제는 === 연산자로 해결됩니다. 그 전에는 들어 본 적이 없어요. –

+0

그것이 작동하는 방식이 아닙니다. 당신은'Equatable' 프로토콜 (따라서 Hashable 프로토콜)의 의미를 위반하고 있습니다. 당신은 당신의 코드에서 버그를 추적하기 위해 이상하고 아주 어려운 일을 일으킬 것입니다. – rmaddy

답변

2

static func ==(lhs: Car, rhs: Car) -> Bool { 
    return lhs === rhs 
} 

심지어 Equatable

myCars.contains{ $0 === mazda } 

편집없이 정체성 연산자를 사용하지만 더 나은 솔루션은 예 A vendortype 속성에 대해, 오히려 정체성보다는 평등을 구현하는 것입니다 클래스

static func ==(lhs: Car, rhs: Car) -> Bool { 
    return lhs.vendor == rhs.vendor && lhs.type == rhs.type 
} 
+1

이 작업을 수행하지 마십시오. Equatable (및 Hashable) 프로토콜의 의미를 위반합니다. – rmaddy

+0

@rmaddy 알아,하지만 OP는 "싼"솔루션을 원합니다. – vadian

+0

그 밖의 무엇을 할 수 있습니까? 기본적으로 Vertex 객체의 배열 인 Graph 클래스가 있습니다. 어떻게 대답하겠습니까? 그래프 객체에 특정 꼭지점이 포함되어 있습니까? –

2
=== 

스위프트의 연산자는 두 개체 참조가 모두 동일한 개체 인스턴스를 참조하는지 확인합니다.

그래서 Equatable는 다음과 같이 수 :

static func ==(lhs: Car, rhs: Car) -> Bool { 
     return lhs===rhs 
    } 

내가 하지이 방법을 추천 할. Equatable의 목적은 동일한 객체에 대한 참조를 평가하지 않는 것입니다.

+0

이렇게하지 마십시오. Equatable (및 Hashable) 프로토콜의 의미를 위반합니다. – rmaddy

+0

나는 Equatable를 사용하는 것이 어떻게 든 잘못되었다고 당신에게 동의한다. 나는 (지향) 그래프의 단순한 구현을 시도하고있다. 기본적으로 정점의 목록 만 있습니다. 그리고 물어보고 싶습니다 : 내 그래프에 특정 정점이 포함되어 있습니까? –

+0

하지만 왜 그것이 같은 참조가 필요합니까? Vertices 속성은 x 및 y 값으로 비교할 수 있습니다. @vadian은 동등성 속성 비교의 위 예제를 제공합니다. –