質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
RxSwift

RxSwiftは、Reactive ExtensionsのSwift向けの実装です。iOS開発に用いられ、リアクティブプログラミングを可能にします。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1763閲覧

【iOS】電話番号バリデーション(正規表現) エラー"Cannot convert value of type 'BehaviorRelay<String>' to expected argumen"

dddd12233

総合スコア13

RxSwift

RxSwiftは、Reactive ExtensionsのSwift向けの実装です。iOS開発に用いられ、リアクティブプログラミングを可能にします。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/07/12 17:42

編集2020/07/12 17:54

現状

イメージ説明

ユーザーがテキストフィールドに電話番号を入力した際、それが電話番号の形式かどうかをバリデーションでチェックし、形式が正しけれボタンが押せるようになるといった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型にキャストする方法、あるいはそれ以外の方法で今回のような電話番号のバリデーションを実現する方法を教えていただきたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

if isPhoneNumber(candidate: phoneNumberText.value) {

こうすることで解決しました!

投稿2020/07/13 04:34

dddd12233

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問