![[Ting] TextField 공백, 특수문자 검사 로직 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqiliN%2FbtsMlitN6ws%2F6L09uE9xoqY6Zj3XgRn1jK%2Fimg.png)
닉네임 같은 값은 중복되지 않고, 유효한 Unique값으로 구현되는 것이 중요하다.
Unique값으로 갈지, 태그를 붙여서 중복 닉네임을 허용할지는 각자 선택할 문제지만, Ting에서는 Unique값으로 결정.
또한 닉네임간의 공백, 특수문자 사용을 허가하지 않기로 결정했기 때문에,
해당 항목들에 대한 검사 로직이 필요하다.
중복검사 로직 구현 글
[Ting / 트러블슈팅] 회원정보 수정 시 닉네임 변경을 강제하는 현상 수정
개요마이페이지에서 회원정보 수정하러 들어가서 저장하기 버튼을 누르면, 회원정보 수정을 강제하는 문제가 생겼다.우리는 닉네임을 유니크 값으로 유지하기로 결정했기 때문에, 중복 닉네임
quaker.tistory.com
따라서 오늘은 TextField에서 공백 및 특수문자를 검사하는 로직을 구현할 것이다.
그리고 extension으로 별도로 생성하여 다양한 파일들에서 재사용이 되도록 구현할 것이다.
extension파일 생성
import UIKit
// MARK: - 공백, 줄바꿈으로만 입력되었는지 체크
func isThereSpaces(text: String) -> Bool { // 어느곳이던 공백이 포함되어있으면 true return
return text.range(of: "\\s", options: .regularExpression) != nil
}
// MARK: - 특수문자 입력되었는지 체크
func isThereSpecialChar(text: String) -> Bool { // 어느곳이던 특수문자가 포함되어있으면 true return
return text.range(of: "[^a-zA-Z0-9가-힣]", options: .regularExpression) != nil
}
range(of:, options:) 메서드는 정규 표현식 패턴에 일치하는 첫번째 범위를 반환한다.
일치하는 부분이 없으면 nil을 반환한다.
각각의 정규식을 보자
\\s //공백 문자(스페이스, 탭, 줄바꿈 등)을 의미한다
"[^a-zA-Z0-9가-힣]" // 알파벳 대소문자, 숫자, 한글을 제외한 나머지 모든것을 의미한다
따라서 해당 정규식에 따라,
공백 검사를 위한 정규식(\\s)같은 경우에는 공백이 포함되어있다면 그 범위를 반환, 아니라면 nil을 return.
즉 nil이 아니라면 공백이 포함되어있다는 의미.
특수문자 검사를 위한 정규식("[^a-zA-Z0-9가-힣]")같은 경우에는, 알파벳 대소문자, 숫자, 한글을 제외한 나머지 항목.
즉 특수문자가 포함되어 있다면 그 범위를 반환, 포함되어있지 않다면 nil을 return.
즉 nil이 아니라면 특수문자가 포함되어있다는 의미.
따라서 저장버튼을 눌렀을때 실행되도록 구현.
// MARK: - Save Button Action
@objc
private func saveBtnTapped() {
let nickname = nickNameField.textField.text ?? "" // 현재 텍스트필드에 있는 닉네임
// MARK: 닉네임 중복 검증
// 닉네임이 변경되지 않은 경우 바로 저장
if nickname == originalNickname { // 서버에 있는 닉네임과 대조
saveUserInfo()
print("닉네임 변경 없음. 중복검사 생략")
} else {
// 공백 검사
if isThereSpaces(text: nickname) == true {
self.basicAlert(title: "오류", message: "공백은 입력할 수 없습니다.")
return
}
// 특수문자 검사
if isThereSpecialChar(text: nickname) == true {
self.basicAlert(title: "오류", message: "특수문자는 입력할 수 없습니다.")
return
}
// 닉네임이 변경된 경우 중복 검사 후 저장
UserInfoService.shared.checkNicknameDuplicate(nickname: nickname) { [weak self] isDuplicate in
guard let self = self else { return }
DispatchQueue.main.async {
if isDuplicate {
self.basicAlert(title: "오류", message: "중복된 닉네임입니다.\n 다른 닉네임을 입력해 주세요.")
} else {
// 중복되지 않은 경우 저장 진행
self.saveUserInfo()
}
}
}
}
}
닉네임을 변경할때, 먼저 서버에 있는 닉네임과 대조하여(해당코드 생략, 링크된 글 참고),
변경점이 없으면 중복검사 및 각종 검사 생략.
변경점이 있다면, 먼저 공백을 체크한다. 단순 공백 하나만으로 눈에 보이지 않는 공백 닉네임을 생성할 우려가 있기 때문.
이후 공백이 없다면 특수문자가 있는지 체크한다.
없다면 중복검사를 실행한다.
각각의 검사에서 통과하지 못한다면 alert을 출력한다.
위의 코드처럼 alert을 간편하게 출력하기 위해, extension으로 기본 alert형태를 이미 구현해두었다.
import UIKit
extension UIViewController {
func basicAlert(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default))
self.present(alert, animated: true)
}
}
구현완료
'개발일지' 카테고리의 다른 글
[Ting / 유저피드백] 키보드 관련 UX 개선 (returnKeyType 설정으로 다음 TextField로 이동) (0) | 2025.02.18 |
---|---|
2025 (0) | 2025.02.12 |
[Ting / 트러블슈팅] 회원정보 수정 시 닉네임 변경을 강제하는 현상 수정 (0) | 2025.02.11 |
2025.02.04 (0) | 2025.02.04 |
[Ting] UISearchBar, Custom Navigation Bar 구현 (0) | 2025.01.23 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.