핸드폰 번호를 판단하여 NSPredicate 술어 논리를 분석하다
//
+(BOOL) isValidateMobile:(NSString *)mobile
{
// 13, 15,18 16 17 , \d
NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(16[0-9])|(17[0-9])|(18[0,0-9]))\\d{8}$";
NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
return [phoneTest evaluateWithObject:mobile];
}
이것은 휴대전화 번호의 진위를 판단하고 다시 한 번 은행 카드 번호를 판단하는 데 쓰인다.
// 16-19
+ (BOOL)judgeBankCardNumber:(NSString*)str
{
//16 19 6
// NSString * pattern = @"";
// NSRegularExpression * reglx = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
// NSArray * array = [reglx]
NSString * cardNumRegex = @"^[6]\\d{3}\\s*\\d{4}\\s*\\d{4}\\s*\\d{4}$|^[6]\\d{3}\\s*\\d{4}\\s*\\d{4}\\s*\\d{4}\\s*\\d{1,3}$";
NSPredicate *numTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",cardNumRegex];
return [numTest evaluateWithObject:str];
}
, NSPredicate, 。 , NSPredicate。
iOS Predicate 。 SQL , 。
NSArray 는 주로 두 가지 방법으로 활용됩니다.
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;
NSMutableArray
- (void)filterUsingPredicate:(NSPredicate *)predicate;
또한 NSSet과 NSMutableSet도 이 클래스로 필터링할 수 있습니다.
필터 사용 구성원 실례 방법을 이용하여 길이가 3보다 큰 문자열을 필터합니다
NSArray *array = @[@"jim", @"cook", @"jobs", @"sdevm"];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"length > 3"];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);
프린트
( cook, jobs, sdevm)
lenght는 그룹 구성원에 대해 [xxxx lenght]를 실행한 다음 되돌아오는 NSUInteger 값이 3보다 큰지 판단하는 것입니다.NSString으로 확장하는 다른 방법(예: integerValue 등)
NSArray *array = @[@"2", @"3", @"4", @"5"];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"integerValue >= %@", @3];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);
만약 내가 어떤 실례적인 방법을 쓰고 싶지 않다면, 멤버 자체를 뽑으려면 어떻게 해야 하는가.이럴 때는 self로 대신할 수 있어요.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"self CONTAINS %@", @3];
CONTAINS 사용법은 다음에 설명합니다.
모델로 확장
Test.h
@interface Test : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *code;
@end
Test *test1 = [[Test alloc]init];
test1.name = @" ";
test1.code = @1;
Test *test2 = [[Test alloc]init];
test2.name = @" ";
test2.code = @2;
Test *test3 = [[Test alloc]init];
test3.name = @" ";
test3.code = @3;
NSArray *array = @[test1, test2, test3];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"code >= %@", @2];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);
그룹 구성원 [test code] 방법 (code 속성의 get 방법) 반환값 >=2의 구성원을 선별합니다.여기서 비교 연산자는 =,!=, <=,
사실==NSNumber 객체를 비교하는 데 사용될 뿐만 아니라 NSString 객체가 동일한지 판단하는 데도 사용될 수 있다.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name == %@", @" "];
name이 '서호' 의 대상 그룹을 선별합니다.
NSString 객체에 대한 작업
앞에서 언급한 == 비교 연산자는 - (BOOL)isEqual ToString: (NSString*)aString을 일으킬 수 있다.문자열이 같은지 아닌지를 판단하는 방법의 효과입니다.그렇다면 문자열에 포함된 문자열은 어떻게 판단해야 하는가. NSPredicate에서는 포함 관계를 CONTAINS(대소문자 모두 가능)로 나타낼 수 있다.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @" "];
판단할 때 대소문자를 무시해야 합니다. [cd]
[c] 대소문자 무시
[d] 중음 기호 무시 [cd]는 대소문자도 구분하지 않고 발음 기호도 구분하지 않습니다.사용:
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"abc"];
문자열이 어떤 문자열로 시작하거나 끝날 때, 어댑터의 사용을 판단하는 등 더 복잡한 검색 문구도 관련된다.
BEGINSWITH(이미 문자열 시작, begins with)
NSString *targetString = @"h"; NSPredicate *pre = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@",targetString];
ENDSWITH(이미 문자열 끝, ends with)
NSString *targetString = @"ing"; NSPredicate *pre = [NSPredicate predicateWithFormat:@"name ENDSWITH %@",targetString];
와일드카드 LIKE
* 하나 이상의 공백을 나타냅니다.
?문자
Test *test1 = [[Test alloc]init];
test1.name = @"absr";
test1.code = @1;
Test *test2 = [[Test alloc]init];
test2.name = @"asb";
test2.code = @2;
Test *test3 = [[Test alloc]init];
test3.name = @"raskj";
test3.code = @3;
NSArray *array = @[test1, test2, test3];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name LIKE %@", @"?b*"];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);
결과는test1만 일치하고like도 받아들일 수 있음[cd]
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@", @"?b*"];
IN, BETWEEN, AND, OR, NOT 등의 관계 연산
IN(중)
NSPredicate *pre = [NSPredicate predicateWithFormat:@"code IN %@", @[@1, @3]];
코드가 @1 또는 @2인지, 즉 그룹에 있는지 판단합니다.
OR(또는 ||로 대체) OR는 IN을 대체하여 같은 효과를 얻을 수 있지만 OR는 더욱 유연하다.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"code == %@ OR code == %@ ", @1, @3];
효과는 IN과 같지만 OR는 하나의 속성만 판단할 수 있다
NSPredicate *pred = [NSPredicate predicateWithFormat:@"code == %@ OR name == %@ ", @1, @"asb"];
BETWEEN(사이)
일반적으로 NSNumber 객체를 판단하는 데 사용됩니다.
NSPredicate *pred = [NSPredicate predicateWithFormat:@"code BETWEEN {1, 3}"];
코드의 >=1 여부를 판단하고 <=3 AND(또한, &&&로 대체할 수 있음)
NSPredicate *pred = [NSPredicate predicateWithFormat:@"code >= %@ AND code <=%@", @1, @3];
NOT
NOT에서 가장 흔히 볼 수 있는 용법은 한 수조에서 다른 수조의 데이터를 제거하는 것이다. 약간 빙빙 돌 수도 있고, 예를 들면 매우 명랑하다.
NSArray *arrayFilter = @[@"abc1", @"abc2"];
NSArray *arrayContent = @[@"a1", @"abc1", @"abc4", @"abc2"];
NSPredicate *thePredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)", arrayFilter];
NSLog(@"%@",[arrayContent filteredArrayUsingPredicate:thePredicate]);
인쇄(a1, abc4)
순환 비교를 새로운 수조에 추가하는 것보다 간단한 것이 한두 가지가 아니다.앞에서 언급한 것은 모두 +(NSPredicate*)predicateWithFormat: (NSString)predicateFormat,....방법 창설, 또 다른 상용 방법: + (NSPredicate) predicate With Block: (BOOL (^) (id evaluated Object, NSDictionary *bindings) Block, Block 형식으로 창설
NSPredicate *pre = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
Test *test = (Test *)evaluatedObject;
if (test.code.integerValue > 2) {
return YES;
}
else{
return NO;
}
}];
매개 변수 evaluatedObject는 그룹 구성원을 표시하고 Block은 YES나 NO로 돌아가 각각 일치하는지 일치하지 않는지 표시해야 합니다.bindings 파라미터를 무시해 주십시오. 구체적인 작용은 저도 잘 모르겠습니다.
다중 선별
여러 개의 속성에 일치하는 선별이 필요하다면 AND나 OR로 연결하는 것은 분명히 번거롭다. NSCompoundPredicate류는 우리의 요구를 충족시킬 수 있다. 이것은 여러 개의 NSPredicate 대상을 조합할 수 있고 조합 방식은 AND나 OR일 수 있다.
NSPredicate *pre1 = [NSPredicate predicateWithFormat:@"code >= %@", @3];
NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"code <= %@", @2];
// AND
NSPredicate *pre = [NSCompoundPredicate andPredicateWithSubpredicates:@[pre1,pre2]];
// OR
NSPredicate *pre = [NSCompoundPredicate orPredicateWithSubpredicates:@[pre1, pre2]];
일치 사용법
사실 NSPredicate는 선별뿐만 아니라 일치가 직접 되돌아오는지 여부를 판단하는 데도 사용된다. 주요한 방법은 - (BOOL)evaluateWithObject: (id)object,사용법:
Test *test1 = [[Test alloc]init];
test1.name = @"absr";
test1.code = @1;
NSPredicate *pres = [NSPredicate predicateWithFormat:@"code == %@", @2];
BOOL match = [pres evaluateWithObject:test1];
물론 가장 자주 사용하는 것은 정규 표현식에 맞추어 몇 가지 자주 사용하는 정규를 열거하는 것이다.
처음에 언급한 두 가지 용법처럼 하나의 예이다
a로 시작하고 e로 끝낼지 여부
NSString *string=@"assdbfe";
NSString *targetString=@"^a.+e$";
NSPredicate *pres = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", targetString];
BOOL match = [pres evaluateWithObject:string];
메일박스인지 여부
NSString *strRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,5}";
휴대폰 번호
NSString *strRegex = @"[0-9]{1,20}";
구덩이
+(NSPredicate*)predicateWithFormat:(NSString*)predicateFormat를 이용하면....메서드가 생성한 NSPredicate 객체에 구멍이 있습니다.
어떤 경우, 상기 예와 유사한 코드 문자열이 명확하지 않아서, 만들 때 이렇게 사용한다
Test *test1 = [[Test alloc]init];
test1.name = @"absr";
test1.code = @1;
Test *test2 = [[Test alloc]init];
test2.name = @"asb";
test2.code = @2;
Test *test3 = [[Test alloc]init];
test3.name = @"raskj";
test3.code = @3;
NSArray *array = @[test1, test2, test3];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%@ == %@", @"code", @2];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);
NSPredicate 객체가 초기화되는 방법에 유의하십시오.이 코드를 실행하면test2 대상이 조회되지 않은 것을 발견할 수 있습니다.프린트pre에서 '코드' ==2를 발견하면 '코드' 방법의 되돌아오는 값을 찾을 수 있습니다. 이것은 분명히 통하지 않습니다.
만약 검색한 것이 속성이라면, 예를 들어 코드가 Test 클래스의 속성이라면, 아래의 생성 방식을 이용하십시오
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K == %@", @"code", @2];
주의하지 않을 것입니다:% K의 K는 대문자여야 합니다.
마지막으로 NSPredicate는 거의 모든 형식의 조회를 만족시킬 수 있으며,CoreData의 데이터베이스 조회에 협조하는 것은 물론이다.NSPredicate의 용법은 이것뿐만이 아니다. 관심 있는 친구들은 nshipster 사이트의 이 블로그를 보면 내가 언급하지 않은 용법을 언급할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.