การตรวจสอบตัวอักษรพิเศษด้วย if-else หรือ switch จะซับซ้อน ใช้ Regular Expression หรือ CharacterSet เร็วกว่าและสะดวกกว่า
วิธีที่ 1: ใช้ Regular Expression
extension String {
var containsSpecialCharacter: Bool {
let regex = ".*[^A-Za-z0-9].*"
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
return predicate.evaluate(with: self)
}
}
// ทดสอบ
print("3r42323".containsSpecialCharacter) // false
print("!--%332".containsSpecialCharacter) // true
วิธีที่ 2: ใช้ CharacterSet (แนะนำ - เร็วกว่า)
let allowedCharacters = CharacterSet.alphanumerics // A-Z, a-z, 0-9
func hasSpecialCharacter(_ string: String) -> Bool {
return string.rangeOfCharacter(from: allowedCharacters.inverted) != nil
}
// ทดสอบ
print(hasSpecialCharacter("3r42323")) // false
print(hasSpecialCharacter("!--%332")) // true
การปรับแต่ง CharacterSet
// อนุญาตตัวอักษรไทย และอีโมจิ ด้วย
var customSet = CharacterSet.alphanumerics
customSet.insert(charactersIn: "แอปเปิ้ล🍎")
// หรือกำหนดเองทั้งหมด
let thaiAndAlphanumeric = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ก-ฮะ-์")
เปรียบเทียบประสิทธิภาพ
- CharacterSet - เร็วกว่า ไม่ต้อง compile regex เหมาะสำหรับการเรียกบ่อย
- Regex - ยืดหยุ่นกว่า สำหรับ Pattern ซับซ้อน
Extension ใช้งานง่าย
extension String {
func containsSpecialCharacters(allowed: CharacterSet = .alphanumerics) -> Bool {
return rangeOfCharacter(from: allowed.inverted) != nil
}
}
// ใช้งาน
"Hello123".containsSpecialCharacters() // false
"Hello@123".containsSpecialCharacters() // true
"สวัสดี".containsSpecialCharacters(allowed: .alphanumerics.union(CharacterSet(charactersIn: "ก-ฮะ-์"))) // false