[RxSwift]UITextField 정규식

나의 구현 🐝

  • MVVM패턴을 적용했기 때문에 구현부는 ViewModel에서 이루어졌다.
  • 매개변수로는 Struct를 정의해주어 해당 타입으로 Input을 만들어주었고, 반환 값도 Struct형식으로 바꾸는데 안에 요소는 Driver로 구현을 해주었다.

 

View Model

Input & Output

// View Model 

/// Input
struct RegularExpressionInput {
    var titleText: Observable<String>
}

/// Output
struct RegularExpressionOutput {
    var titleTextCheck: Driver<Bool>
}
  • Input 구조체는 View Controller에서 rx.text로 바인딩을 해줄것이니 Observable<String>타입으로 정의를 해준다.
  • Output 구조체는 View Controller에서 UI에 반영이 될 부분이라 Driver<Bool>타입으로 정의를 해준다.

 

정규식 구현

/// 정규식
func regularExpressionCheck(input: RegularExpressionInput) -> RegularExpressionOutput {
    let output = input.titleText.map {
        let pattern = "^[0-9a-zㅏ-ㅣA-Zㄱ-ㅎ가-핳\\s]*$"
        guard let _ = $0.range(of: pattern, options: .regularExpression) else { return false }
        return true
    }.asDriver(onErrorJustReturn: false)
    return RegularExpressionOutput(titleTextCheck: output)
}
  • input으로 들어오는 RegularExpressionInput 매개변수의 데이터인 titleText를 매핑하는데, gurad문과 .range를 통해 true/false로 반환을 할 수 있도록 해준다.
  • 매핑 된 Bool값을 .asDrvier를 통해 Driver 타입으로 바꿔주고, 에러가 있다면 false를 반환할 수 있도록 onErrorJustReturn: fales를 넣어주었다.

 

View Model에서 구현한 부분을 View Controller에서 구현해보자

View Controller

Part .Binding

// Input은 해당 타입으로만 만들어주면 되기 때문에 따로 할당을 해주진 않는다.
let regualExpressionInput = ABCViewModel.RegularExpressionInput(
    titleText: titleTextField.rx.text.orEmpty.asObservalbe()
)

// viewModel은 선언되었있다(ABCViewModel)
let regularExpressionDriver = viewModel.regularExpressionCheck(input: regualExpressionInput)

// disposeBag은 선언되어있다
regularExpressionDriver.titleTextCheck
    .drive(onNext: {[weak self] in
        self?.noticeLabel.text = $0 ? "True 입니다." : "False 입니다."
        // etc... 구현부
    })
    .disposed(by: disposeBag)
  • 위와 같이 Input과 Output을 만들어주는데 Output은 함수로 ViewModel에서 구현했던 함수로 접근을 하고, 해당 반환되는 Driver(Bool)을 통해 UI를 반영해주었다.
  • 여기서 더 추가적으로 텍스트가 비어있을 경우의 케이스를 더 넣어준다면 아래와 같은 코드를 넣어줄 수 있다.
guard self?.titleTextField.text?.isEmpty == false else {
    // UITextField가 비어있는 경우
}
// UITextField가 비어있지 않는 경우

'iOS_Swift.zip' 카테고리의 다른 글

[RxSwift]Relay 버튼 활성화  (0) 2022.09.24
[Swift]SnapKit + Then CollectionView Cell Size  (0) 2022.09.10
[Swift]Status Bar 색상 변겅  (0) 2022.04.21
[iOS]Strong과 weak 참조 방식  (0) 2022.02.27
[iOS]Protocol  (0) 2022.02.20