現状
ユーザーがテキストフィールドに電話番号を入力した際、それが電話番号の形式かどうかをバリデーションでチェックし、形式が正しけれボタンが押せるようになるといったUIです。
【ViewController】
Swift
1 2import UIKit 3import RxSwift 4import RxCocoa 5 6class ViewController: UIViewController { 7 8 9 @IBOutlet weak var telNoTextField: UITextField! 10 @IBOutlet weak var button: UIButton! 11 12 var viewModel : ViewModel? 13 private let disposeBag = DisposeBag() 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 19 //// データバインディング 20 /// テキストフィールド 21 // ビューからモデルへ 22 telNoTextField.rx.text.orEmpty.bind(to: viewModel!.telNoText) 23 .disposed(by: disposeBag) 24 25 // モデルからビューへ 26 viewModel!.telNoText.bind(to: telNoTextField.rx.text) 27 .disposed(by: disposeBag) 28 viewModel!.telNoText.subscribe(onNext: { [weak self] text in 29 self!.viewModel?.validation() 30 }).disposed(by: disposeBag) 31 32 /// ボタン 33 // モデルからビューへ 34 viewModel!.button.bind(to: button.rx.isEnabled) 35 .disposed(by: disposeBag) 36 37 viewModel!.buttonOpacity.bind(to: button.rx.alpha) 38 .disposed(by: disposeBag) 39 40 41 // 次へボタン 42 button.rx.tap.subscribe { [weak self] _ in 43 print("押されました") 44 }.disposed(by: disposeBag) 45 } 46} 47
電話番号の入力フォームとボタンを接続し、RXSwiftでViewModelとデータバインディングしています。
【ViewModel】
Swift
1import RxSwift 2import RxCocoa 3 4final class ViewModel { 5 6 var telNoText = BehaviorRelay.init(value: "") 7 var button = BehaviorRelay.init(value: false) 8 var buttonOpacity = BehaviorRelay.init(value: CGFloat(1)) 9 10 func validation() { 11 12 if isPhoneNumber(candidate: telNoText) { 13 button.accept(true) 14 buttonOpacity.accept(1) 15 }else{ 16 button.accept(false) 17 buttonOpacity.accept(0.35) 18 } 19 } 20 21 func isPhoneNumber(candidate: String) -> Bool { 22 let emailRegex = "^\d{2,4}-\d{1,4}-\d{4}$" 23 return NSPredicate(format: "SELF MATCHES %@", 24 emailRegex).evaluate(with: candidate) 25 } 26}
ViewModelに電話番号のバリデーションを用意しています。
現状、
if isPhoneNumber(candidate: phoneNumberText) {
ここの行で
"Cannot convert value of type 'BehaviorRelay<String>' to expected argument type 'String'"
このようなエラー('BehaviorRelay <String>型の値を予期された引数に変換できません)が出ています。
このエラーを解決し、電話番号のバリデーションをできるようにしたいのですが、どのような修正が必要でしょうか?
試したこと
if isPhoneNumber(candidate: phoneNumberText as! String) {
このようにした場合、
エラー:"Thread 1: signal SIGABRT"
Cast from 'BehaviorRelay<String>' to unrelated type 'String' always fails
となります。
また、
func isPhoneNumber(candidate: BehaviorRelay<String>) -> Bool {
このような修正をしても、
class AppDelegate: UIResponder, UIApplicationDelegate {
の箇所で
エラー
"Thread 1: Exception: "Can't do regex matching on object RxRelay.BehaviorRelay<Swift.String>."
となります。
聞きたいこと
'BehaviorRelay<String>'をString型にキャストする方法、あるいはそれ以外の方法で今回のような電話番号のバリデーションを実現する方法を教えていただきたいです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。