iOS - 빠른 필터링, 정리 및 계산
디렉토리:
-NSPredicate -NSSortDescriptor -KVC
NSPredicate
NSPredicate
이라는 종류는 많은 사람들이 낯설다.이것은 애플이 제공하는 빠른 선별 대상 데이터의 필터로 강력하면서도 간결하다.CoreData
에서 뚜렷하게 드러난다.키워드
AND
OR
이러한 해석은 =
>
<
>=
<=
==
!=
BETWEEN {x,y}
IN{x,.....}
: 모호한 조회 2.MATCHES
: 문자열 3.LIKE
: 문자열 시작 4.CONTAINS
: 문자열 끝 5.BEGINSWITH
: 문자열 자체로 문자열 그룹에 사용됩니다.구문 형식
대상 필드 일치 키워드 일치 필드:
ENDSWITH
여러 일치 AND OR 추가 가능 기본적으로 sql: SELF
//
Food {
name,
monry
}
@property (copy, nonatomic)NSArray *sources;
예를 들어 나는 대상(
age == 123
)의 수조에서 변수의 이름이 name == 'xxx' AND age == 123
이고 그 값이 Food
인 대상을 선별하려고 한다.이전 방식:NSMutableArray *foods = [@[] mutableCopy];
for (Food *food in self.sources) {
if ([food.name isEqualToString:@" "]) {
[arrayM addObject:food];
}
}
현재 방식:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@" "];
NSArray *foods = [self.sources filteredArrayUsingPredicate:predicate];
갑자기 높아졌다는 걸 알게 될 거야.Y(_)Y 물론 이것들은 비교적 기초적인...
일반적으로 사용되는 기능:
// [cd]: , [cd]
// *: sql %
NSString * searchText = @"xxx";
//NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@",[NSString stringWithFormat:@"*%@*",searchText]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",searchText];//
NSArray *searchFoods = [self.sources filteredArrayUsingPredicate:predicate];
//BETWEEN{x,y}
NSPredicate *between = [NSPredicate predicateWithFormat:@"monry BETWEEN{10,100}"];
NSArray *betweenFoods = [self.sources filteredArrayUsingPredicate: between];
//IN{x,.....}
NSPredicate *inPred = [NSPredicate predicateWithFormat:@"name IN{%@,%@}",@"xx",@"xxxx"];
NSArray * inPredFoods = [self.sources filteredArrayUsingPredicate: inPred];
//MATCHES
NSString *regex =@"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";//
NSPredicate *regexTestMobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isPhone = [regexTestMobile evaluateWithObject:@"13111111111"];
NSSortDescriptor(정렬)
서열에 있어서는 낡은 방법을 쓰지 않겠다.(게으름*\(o)/*)
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"monry" ascending:YES];
NSArray *foods = [self.sources sortedArrayUsingDescriptors:@[sortDescriptor]];
/*
// , ,
[self.sources sortUsingComparator:^NSComparisonResult(Food * _Nonnull obj1, Food *_Nonnull obj2) {
return !sender.selectedSegmentIndex?[obj1.monry compare:obj2.monry]:[obj2.monry compare:obj1.monry];
}];
*/
물론 이것은 단순 정렬일 뿐이다.복잡하게 스스로 논리를 써야 할 때도
name
또는
에서 제공한 방법을 사용할 수 있다.@interface NSArray (NSExtendedArray)
...
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))comparator context:(nullable void *)context;
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))comparator context:(nullable void *)context hint:(nullable NSData *)hint;
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator;
...
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
- (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
@end
@interface NSMutableArray (NSExtendedMutableArray)
...
- (void)sortUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))compare context:(nullable void *)context;
- (void)sortUsingSelector:(SEL)comparator;
...
- (void)sortUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
- (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
@end
또 어떤 곳은 글자 수를 차지하지 않으니 스스로 찾아라.
KVC를 사용한 컴퓨팅
키워드
NSArray
: 최소값 NSSet
: 최대값 @min
: 평균값 @max
: 합계기초 연산
NSInteger min = [[self.sources valueForKeyPath:@"@min.monry"] integerValue];
NSInteger max = [[self.sources valueForKeyPath:@"@max.monry"] integerValue] ;
NSInteger sum =[[self.sources valueForKeyPath:@"@sum.monry"] integerValue];
double avg = [[self.sources valueForKeyPath:@"@avg.monry"] doubleValue] ;
사용한 순간 세상이 많이 좋아진 것 같아요.
요약:
물론 이것들은 모두 프로젝트 안의 논리적 수요를 보고 어떻게 개인과 어울리는지 보는 것이다(☆ ☆).가장 간단한 실전 경험: 나는 현지에서 읽지 않은 메시지의 총계를 계산해서 Tabbar Badge에 표시하거나 App Icon Badge에 표시하고 싶다.
논리: NSPredicate를 사용하여 읽지 않은 메시지 세션을 필터링한 다음 @sum.count, 최종 할당.물론 수요도 보아야 한다. 그리고 네가 논리를 실현하는 것은 네 계산에 달려 있다.
DEMO
마지막으로 어떤 글이 틀렸는지 댓글로 토로해 주시고 함께 공부하는 분들을 환영합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.