시나리오: Swift에 튜플(tuple)이라는 개념을 우리는 배웠지만 커뮤니티를 통해서 이야기해보니 생각보다 튜플사용경험이 없으신 개발자분들도 계셔서 개인적인 사용경험을 공유해보려고 함. (더 좋은 사용경험이 있으면 공유감사합니다👍)
기획 요구사항:
1. 아이디와 패스워드를 입력받는 화면을 가정
2. 하단의 로그인 버튼이 있다고 가정
3. 로그인 버튼을 클릭 했을 때 아이디와 패스워드를 입력받을 텍스트필드의 대한 유효성 검사를 진행
4. 아이디 및 패스워드가 입력이 안되었을 때 입력이 안될 텍스트 필드를 고객에게 어필하면서 입력요청!
ex) 아이디를 입력해주세요 . 패스워드를 입력해주세요.
손가는 대로 우선 코드로 함수를 만들어 보았다.
//의식의 흐름대로 머리보다 손으로 짜 본 코드
//@parameter id 아이디
//@parameter password 비밀번호
//@return (success: Bool,errorMessage: String?) (성공여부, 에러메시지)
func isValid(id: String?, password: String?) -> (success: Bool,errorMessage: String?) {
guard ((id?.isEmpty) != nil) else { return (false,"id를 입력해주세요")}
guard ((password?.isEmpty) != nil) else { return (false,"비밀번호를 입력해주세요")}
return (true,nil)
}
그리고 로그인 버튼을 눌렀을 때 success 값의 따라서 if 절로 구현을 했다.
let validationCheckResult = isValid()
if validationCheckResult.success {
// do your next job
}else{
print(validationCheckResult.errorMessage)
}
아이디와 비밀번호만 유효성검사를 한다고 가정했을 때는 정상적으로 동작하였다.
하.지.만
다른 항목들이 추가되고, 그에 따른 유효성검사를 해야한다면
1. 그 때마다 파라미터를 추가할 것인가?
2. 함수를 만들것인가?
아하.. 비효율적일거 같다는 생각이 들어 리팩토링을 진행해 보았다.
리팩토링 목적
1. 재사용성
2. 다른 유효성 검사가 필요한 텍스트필드들에 대한 공통함수를 만들고 싶다.
자! 이제 시작해보자!
수정할 내용 정리
1.파라미터를 String으로 받은 부분을 TextField를 받는 것으로 변경
2.enum을 이용한 에러메시지 정의
이정도로 정의하고 진행해 보도록 하겠다.
var idTextField: UITextField = UITextField()
var passwordTextField: UITextField = UITextField()
//enum을 통해서 에러메시지를 매칭하기 위해 tag를 활용
idTextField.tag = 0
passwordTextField.tag = 1
아! 그리고 typealias 를 사용해서 간단명료하게 보이도록 해보았다.
//: ### 튜플의 가독성이 불편하여 사용할 때는 간편하게보기 위해 typealias 사용
typealias MyErrorType = (success: Bool,errorMessage: String?)
그리고 enum 으로 에러메시지를 정의
//: ### enum 으로 에러메시지 정리, CaseIterable 프로토콜을 사용하여 tagId로 case 의 rawValue 가져오도록 함
enum ErrorMessage: String, CaseIterable {
case id = "id를 입력해주세요"
case password = "패스워드를 입력해주세요"
static func getMessageById(tag: Int) -> String {
for (index,item) in self.allCases.enumerated() {
if index == tag {
return item.rawValue
}
}
return ""
}
}
이렇게 코드를 짜놓고 유효성검사를 진행할 함수를 고쳐보자
func isValid(textFields: UITextField ...) -> MyErrorType {
for item in textFields {
print(item.text)
guard let text = item.text, text.isEmpty else {
// textField가 nil이거나 !empty 이면 continue
continue
}
// isEmpty 이면 false return
return (false, "\(ErrorMessage.getMessageById(tag: item.tag))")
}
return (true,nil)
}
빠른테스트를 진행해보자!
let validationResult = isValid(textFields: idTextField,passwordTextField)
print(validationResult)
print(validationResult.success)
print(validationResult.errorMessage)
idTextField.text = "Atlas"
print("------------")
let validationResult2 = isValid(textFields: idTextField,passwordTextField)
print(validationResult2)
print(validationResult2.success)
print(validationResult2.errorMessage)
아이디,패스워드가 둘다 입력이 안된 경우면 먼저 필터링 되는 메시지를 보여주고
아이디가 입력이 되고, 패스워드가 입력이 안된 경우 "패스워드를 입력해주세요" 메시지를 return 하는걸 확인할 수 있다.
마무리
이렇게 튜플을 활용해서 써본 경험을 공유합니다.
더 좋은 사용경험 공유는 언제든 환영이고 미리 감사말씀드립니다 :)
gitHub:
https://github.com/PotatoArtie/Potato-iOS/tree/master/Labs/TuplePotato.playground
크로스 플랫폼 - 리액트 네이티브(React Native) (8) | 2024.11.07 |
---|---|
[로티파일즈] LottieFiles Figma to Lottie Course - 피그마에서 Lottie 애니메이션 만들기 (2) | 2024.06.25 |
[지라] 자동화 말머리 추가하기 (JIRA Automation) (2) | 2023.04.11 |
[Slack + GitHub] GitHub 작업 알림받도록 연동해보기 (0) | 2022.06.29 |
[SwiftUI] 인텔리제이(intellij) AppCode 사용해보기 (Xcode랑 첫인상 비교) (0) | 2022.03.01 |
댓글 영역