관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] NSPredicate (핸드폰 번호, 이메일, 패스워드 정규성 검사, CoreData 쿼리) 본문

iOS 응용 (swift)

[iOS - swift] NSPredicate (핸드폰 번호, 이메일, 패스워드 정규성 검사, CoreData 쿼리)

jake-kim 2021. 7. 3. 23:12

NSPredicate

  • 메모리 내에서 어떤 값을 가져올때 filter에 대한 조건

  • 사용처1: CoreData에서 특정 데이터를 가져올때 NSPredicate 사용
// CoreData에서 특정 id 값 존재

let request: NSFetchRequest<Entity> = Entity.fetchRequest()
let predicate = NSPredicate(format: "id == $@", id)
request.predicate = predicate
  • 사용처2: Regular Expression 문법을 따르므로, 핸드폰 번호 / 이메일 / 패스워드 정규식 체크에 사용
    • NSPredicate의 메소드인 evaluate(with:)을 사용하여 정규식 판별 
    • Regular Expression 개념 참고
// 핸드폰 번호 정규성 체크
func validatePhoneNumber(_ input: String) -> Validation<String, String> {
    
    let regex = "^01[0-1, 7][0-9]{7,8}$"
    let phonePredicate = NSPredicate(format: "SELF MATCHES %@", regex)
    let isValid = phonePredicate.evaluate(with: input)
    
    if isValid {
        return .valid(input)
    } else {
        return .invalid("invalid phone number")
    }
}

// 이메일 정규성 체크
func validateEmail(_ input: String) -> Validation<String, String> {
    let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format: "SELF MATCHES %@", regex)
    let isValid = emailPredicate.evaluate(with: input)

    if isValid {
        return .valid(input)
    } else {
        return .invalid("invalid email")
    }
}

// 패스워드 정규성 체크
func validatePassword(_ input: String) -> Validation<String, String> {
    let regex = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+=-]).{8,50}" // 8자리 ~ 50자리 영어+숫자+특수문자

    let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
    let isValid = predicate.evaluate(with: input)

    if isValid {
        return .valid(input)
    } else {
        return .invalid("invalid password")
    }
}

NSExpression

  • 비교 조건에 사용되는 표현식

* NSPredicate와 연관된 NSExpression 개념: https://ios-development.tistory.com/593

 

* 참고

- NSPredicate: https://developer.apple.com/documentation/foundation/nspredicate

- NSPredicate programming guide: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/AdditionalChapters/Introduction.html#//apple_ref/doc/uid/TP40001789

 

Comments