나의 구현 🐝
- 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 |