1
0

More than 1 year has passed since last update.

RxSwiftでUITextViewからハッシュタグを抽出する

Last updated at Posted at 2022-02-08

##前提

 UITextViewに入力されたものから新しく入力されてハッシュタグを抽出するのをRxSwfitでやってみました。ReplaySubjectはあまり話題に上がらないので、こういう使い方ができるのを知っていただければと思います。

##手順

  • UITextView.textとReplaySubjectをバインドする。
  let differenceTxtSubject = ReplaySubject<String>.create(bufferSize: 1)
  txtView.rx.text
    .debounce(.milliseconds(300), scheduler: MainScheduler.instance)
    .bind(to: differenceTxtSubject)
    .dispose(by: disposeBag)

 ReplaySubjectはバッファされた分だけ遡ることができる。この場合はバッファサイズは1なので、1個前に流れてきたものと現在のものを比べることができる。

  • 前回のものと今回のものを配列化し、今回の配列の中で前回の配列に入ってない要素を抽出するObservableを用意する。
 var searchingQuery: Observable<String> {
        
        return Observable.zip(differenceTxtSubject, differenceTxtSubject.skip(1)) { previous, current in
            
            var previousNoHashTagArr = previous.components(separatedBy: "#").filter { $0 != "" }
            previousNoHashTagArr = previousNoHashTagArr.map { $0.filter { char in
                
                return char != " "
                
            } }
            
            var currentNoHashTagArr = current.components(separatedBy: "#").filter { $0 != "" }
            currentNoHashTagArr = currentNoHashTagArr.map { $0.filter { char in
                
                return char != " "
                
            } }
            
            let compareArr = zip(previousNoHashTagArr, currentNoHashTagArr)
            
            if let query = compareArr.first(where: { $0.0 != $0.1 })?.1 {
                
                return query
            }
            
            return ""
        }
        
    }

 このObservableをviewdidloadなどでsubscribeすれば、textViewに入力される度にハッシュタグを抽出できる。
 私の場合、抽出されるたびにハッシュタグを検索して予測変換的な機能を実装しています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0