Effective-Objc 52 tips
1. 대상이 같은지 아닌지를 판단하는 tip
NSString *foo = @"Badger 123";
NSString *bar = [NSString stringWithFormat:@"Badger %i", 123];
BOOL equalA = (foo == bar); //< equalA = NO
BOOL equalB = [foo isEqual:bar]; //< equalB = YES
BOOL equalC = [foo isEqualToString:bar]; //< equalC = YES
isEqual 방법은 NSObject 프로토콜에서 유래한 것으로 때때로 등호가 해결할 수 없는 문제는 isEqual 방법을 다시 써서 사용자 정의로 실현할 수 있다.그 내부 원리는 각object의hash값을 계산하여 두 object가 같은지 아닌지를 판단하는 데 있다.
- (NSUInteger)hash;
한편,hash의 계산은 시간 소모 작업이기 때문에hash를 계산하지 않고 모든 대상의identifier 값을 계산함으로써 목적을 달성할 수 있다.물론class를 정의할 때identifier 속성을 추가하고 비교 방법을 추가해야 합니다
@property NSUInteger identifier;
2) 상등성 판단은 집합에 사용되는 작용을 알 수 있는 집합은 중복된 원소가 있는 것을 허용하지 않지만, 때로는 집합에 가변수 그룹을 추가하면 집합에 포함된 원소와 같은 상황이 발생할 수 있으므로 아래 코드를 참고한다.
NSMutableSet *set = [NSMutableSet new];
NSMutableArray *arrayA = [@[@1, @2] mutableCopy];
[set addObject:arrayA];
NSLog(@"set = %@", set);
// Output: set = {((1,2))}
NSMutableArray *arrayB = [@[@1, @2] mutableCopy];
[set addObject:arrayB];
NSLog(@"set = %@", set);
// Output: set = {((1,2))}
위의 이런 방식으로 집합 중의 원소를 첨가하면 집합 중의 원소가 일치하는 상황이 나타나지 않는다는 것을 알 수 있다
그런데 이렇게 하면 돼!
NSMutableArray *arrayC = [@[@1] mutableCopy];
[set addObject:arrayC];
NSLog(@"set = %@", set);
// Output: set = {((1),(1,2))}
[arrayC addObject:@2];
NSLog(@"set = %@", set);
// Output: set = {((1,2),(1,2))}
이렇게 하면 집합set에 두 개의 같은 원소가 존재하는 것을 실현할 수 있다.물론 이 문제는 다른 사고를 일으키기 위한 것이다. 우리는 집합에 같은 요소가 존재하는 것을 실현할 수 있지만 집합이 복사된 후에도 똑같이 원래를 유지할 수 없다. 물론 원래를 유지할 수 없다. 이것이 바로 우리가 집합 안에서 같은 비교 판단을 할 때 주의를 기울여야 하는 문제이다!
1. 두 개의 object가 같은지 비교하려면 isEqual:hash 두 가지 방법을 실현하십시오
2. 두 대상이 서로 같고 반드시 같은hash값을 함유한다.그러나 같은 해시 값을 함유한 두 대상은 반드시 같지 않다
3. 비교 방법(예를 들어identifier)을 교묘하게 설계하여 모든 속성을 간단하고 직접적으로 비교하는 것보다 더 의미가 있다.
4. 절대 유일성을 실현하기 위해hash방법은 복잡하게 설계할 수 있으나 성능을 고려하여hash충돌을 적당히 남겨두는 것도 필요하다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.