2013-10-06 1 views
2

NSArray이 있고 각 항목은 알 수없는 유형 (id)의 객체를 참조하는 keyA, keyB 및 keyC라는 세 개의 키가있는 NSDictionary입니다. 나는 그 세 키 지정된 요소를 발견하는 방법을 쓰고 싶었다 경우iOS : 열거 할 때 객체 평등

-(NSDictionary *) itemThatContainsKeys:(id)objectA and:(id)objectB and:(id)objectC 

나는 단지 등 if([i objectForKey:(keyA) isEqualTo:objectA]를 통해 통해 테스트 개체 평등을) 열거 문제로 실행됩니다? 사전 초기화에 설정된 실제 객체를 전달할 것입니다. 즉, 같은 값이지만 다른 위치의 문자열이 아닌 것입니다.

이것은 나쁜 습관입니까? 데이터베이스를 만들지 않고이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

작성한 동일한 객체를 전달하려는 경우'isEqualTo'보다'=='이 더 적절하지 않습니까? – AbdullahC

+0

그럴까요? 나는 아직도 배우고있다. 그리고 컴퓨터 과학자는 아니다. 그 차이를 설명해 주시겠습니까? – JoshDG

+0

@Hippo'isEqualTo'는 어쩌면 첫 번째 검사 중 하나로 '=='을 구현했을 것입니다. 그래서 그것은 논점입니다.'isEqualTo'를 사용하면 넓은 범위를 제공합니다 – iwasrobbed

답변

0

isEqual : 메서드는 하위 클래스로 덮어 쓰지 않는 한 개체 ID를 비교합니다. 목표가 어떤 수업인지에 따라 5 월 또는 5 월이 원하는 결과가 아닐 수도 있습니다. 내가 선호하는 것은 isEqualToNumber와 같은 클래스 별 비교를 사용하는 것입니다. 단순히 explicitness이기 때문입니다. 그러나 isEqual은 대상에 따라 작동해야합니다.

당신이하고있는 일에 대해 더 자세히 알지 못한다면, 당신이 한 일을 성취 할 수있는 더 좋은 방법이 있는지 말하기가 어렵습니다. 그러나 여기에 내 생각이있다.

앱의 일부 구문을 나타 내기 위해 사용자 정의 클래스가 필요한 것처럼 사전 배열이 거의 들립니다. 아마도 사전은 isEqualToAnotherThing : 메소드를 구현하는 사용자 정의 객체로 대체 될 수 있습니다. 이렇게하면 논리가 단순 해집니다.

+0

'isEqual :'과'isEqualTo :'의 의미에는 차이가 없습니다. 'NSObject'는 포인터를 비교하기 위해'isEqual :'을 구현하는 반면, 각 코코아 값 클래스는 그것을 사용하여 값 의미를 비교합니다. –

+0

여기에 대한 참조가 있으십니까? 왜냐하면 isEqual과 isEqualToNumber가 같은 것을 의미하는 문서는 본적이 없기 때문입니다. https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/isEqual : –

+0

isEqualTo 추가 비교를 수행합니다. 따라서'=='와'isKindOfClass'를 검사하여 실패 할 수 있으며, 실패한 경우에는 NO를 반환합니다. 그런 다음 더 깊게 들어가서'numberA == numberB'와 같은 값 비교를 확인하십시오. – iwasrobbed

1

isEqual을 재정의하여 유형에 대한 동등성을 규정 할 수 있습니다. 동일한 규칙이 다른 언어로 적용

  • 당신이 '해시'같은 '해시'
  • 을 가져야한다 '동일'이다
  • 객체의 구현을 제공해야한다 같습니다 당신은 구현을 제공하는 경우 등호 전이되어야 -> A는 B와 동일하고, B는 다음 C 양방향이어야 A.에게
  • 같음 같아야 C 같으면 - 후 B는 A.

에게 같아야 A가 B와 동일한 경우> 이렇게하면 수업 시간에 예상되는 행동을 보장 할 수 있습니다. NSSet은 성능을 위해 해시를 사용하고, 충돌이있을 때 등호로 떨어집니다.

Jason Whitehorn이 지적한 것처럼 Objective-C는 편의를 위해 또 다른 isEqualToMyType 메서드를 제공하는 규칙을 사용합니다.

AppCode, EqualsBuilder, 보일러 플레이트 코드

가 아파치의 'EqualsBuilder'클래스 같은했지만, 그동안 AppCode 당신을 위해 이러한 방법을 구현하는 좋은 일을하는 경우 그것은 좋은 것입니다.