Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #300】[RxSwift]observableをトリガーとして使う(withLatestFrom)

はじめに

あるobservableをトリガーとするobservableを作ることができます。 例えば、ボタンタップをトリガーとして、テキストフィールドに 入力されたテキストを表示すること、などができます。

もっと実用的な例としては、ボタンタップをトリガーとして、 テキストフィールドに入力されたテキストでAPIに リクエストすることなどが考えられます。

トリガーを使うobservableを作るoperatorは下記2つが使われます。

  • withLatestFrom(_: )
  • sample(_: )

ここでは特に使われることが多いwithLatestFrom(_: )について見ていきます。

RxSwiftについてしっかり学びたいなら、こちらの書籍がおすすめです。

withLatestFrom(_: )

トリガーからnextイベントが送られてくるたびにnextイベントを送ります。

例ボタンタップするとテキストフィールドの入力値をラベルに表示する

画面

初期表示
f:id:fjswkun:20170519214835p:plain

テキスト入力
f:id:fjswkun:20170519214843p:plain

ボタンタップ
f:id:fjswkun:20170519214851p:plain

ラベルに入力値が表示されます。

ソース

画面はstoryboardを使って作っています。

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var resultLabel: UILabel!
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let observable = button.rx.tap.asObservable().withLatestFrom(textField.rx.text)
        observable.subscribe(onNext: { [weak self] text in
            self?.resultLabel.text = text
        })
        .disposed(by: disposeBag)
    }
}

サンプル入手

SampleTrigger1.zip - Google ドライブ

例ボタンタップするとテキストフィールドの入力値を使ってAPIにりくえすとする

APIiTunes Search APIを使用します。
https://affiliate.itunes.apple.com/resources/documentation/itunes_search_api_jp/

画面

初期表示
f:id:fjswkun:20170519222323p:plain

テキスト入力
f:id:fjswkun:20170519222331p:plain

ボタンタップ f:id:fjswkun:20170519222339p:plain

APIが実行され、結果が画面下のテキストビューに表示されます。
APIJSONレスポンスはStringにパースしました。

ソース

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var textView: UITextView!
    
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let observable = button.rx.tap.asObservable().withLatestFrom(textField.rx.text)
        
        observable
            .map{ $0 ?? ""}
            .flatMap(search)
            .map{ (_, data) in
                return String(data: data, encoding: .utf8) ?? ""
            }
            .observeOn(MainScheduler.instance)
            .subscribe(onNext: { [weak self] result in
                self?.textView.text = result
            })
            .disposed(by: disposeBag)
    }
    
    func search(word: String) -> Observable<(HTTPURLResponse, Data)>{
        let baseURL = "https://itunes.apple.com/search?term="
        guard let url = URL(string: baseURL + word) else{
            return Observable.never()
        }
        let request = URLRequest(url: url)
        
        return URLSession.shared.rx.response(request: request)
    }
}

サンプル入手

SampleTrigger2.zip - Google ドライブ

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事