Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

Swift에서 문자열에 특수 문자 포함 여부를 확인하는 방법

Swift에서 문자열에 특수 문자(기호)가 포함되어 있는지 확인해야 하는 경우가 자주 있습니다. if-else나 switch 같은 조건문으로 일일이 비교할 수도 있지만, 그렇게 하면 조건 분기가 많아져 코드 작성과 실행 모두 비효율적입니다. 이 글에서는 정규식(Regular Expression)을 활용하는 방법과, Swift가 기본 제공하는 CharacterSet을 활용하는 방법, 두 가지 방식으로 특수 문자 포함 여부를 손쉽게 검사하는 방법을 소개합니다.

방법 1 − 정규식(Regular Expression) 사용하기

먼저 String 타입의 확장(extension)을 만들고 아래와 같은 코드를 추가합니다.

extension String {
    var containsSpecialCharacter: Bool {
        let regex = ".*[^A-Za-z0-9].*"
        let testString = NSPredicate(format:"SELF MATCHES %@", regex)
        return testString.evaluate(with: self)
    }
}

위 확장을 추가하면 문자열 어디에서든 containsSpecialCharacter 프로퍼티를 호출해 특수 문자 포함 여부를 간단히 확인할 수 있습니다. 정규식 [^A-Za-z0-9]는 영문 대소문자와 숫자를 제외한 모든 문자, 즉 특수 문자에 해당합니다.

실제로 아래와 같은 코드를 실행해 결과를 확인해 보겠습니다.

override func viewDidLoad() {
    super.viewDidLoad()
    print("3r42323".containsSpecialCharacter)
    print("!--%332".containsSpecialCharacter)
}

실행 결과

영문자와 숫자만 포함된 "3r42323"은 false, 특수 문자가 섞여 있는 "!--%332"는 true가 출력됩니다.

이번에는 두 번째 방법으로 동일한 예제를 살펴보겠습니다.

방법 2 − CharacterSet 사용하기

Swift의 CharacterSetrangeOfCharacter(from:) 메서드를 활용하면 정규식 없이도 같은 결과를 얻을 수 있습니다.

let characterset = CharacterSet(charactersIn:
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
)
if "3r42323".rangeOfCharacter(from: characterset.inverted) != nil {
    print("true")
} else {
    print("false")
}
if "!--%332".rangeOfCharacter(from: characterset.inverted) != nil {
    print("true")
} else {
    print("false")
}

여기서 characterset.inverted는 허용된 문자 집합(영문자 + 숫자)의 여집합, 즉 특수 문자 집합을 의미합니다. 따라서 문자열 중 하나라도 이 집합에 속하는 문자가 있으면 rangeOfCharacter가 범위를 반환하므로, nil이 아닌지 검사하는 것만으로 특수 문자 포함 여부를 판별할 수 있습니다.

실행 결과

두 번째 방법 역시 첫 번째 예제와 동일하게 "3r42323"은 false, "!--%332"는 true가 출력됩니다.

정리

두 방법 모두 문자열에 특수 문자가 있는지 검사하는 데 유용합니다. 정규식은 복잡한 패턴 매칭에 유연하고, CharacterSet 방식은 코드가 직관적이며 성능 면에서도 효율적입니다. 상황에 맞게 선택하여 사용하면 됩니다.