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

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

【iOS Swift入門 #308】パフォーマンス・実行速度改善のために処理時間を計測する

はじめに

大量のデータを扱う場合、パフォーマンス・実行速度が遅く、原因追求のために処理時間を計測することがあります。

自分は今まで処理前と処理後にNSDateを取得し、計測していました。

でも、ずっと前にXCTestで処理時間計測のための機能が追加されていることに気づきました。

処理時間計測のメソッド

XCTestフレームワークのXCTestCaseクラスのメソッドとして実装されています。 下記2つのメソッドです。

  1. measureBlock:
  2. measureMetrics:automaticallyStartMeasuring:forBlock:

ブロック内に書いた処理の処理時間を計測してくれます。2つ目のmeasureMetrics:automaticallyStartMeasuring:forBlock:を使うと、計測の開始と終了を指定することができます。

サンプル

実装

ViewControllerに指定した回数ループするメソッドを作りました。

import UIKit

class ViewController: UIViewController {
    func loop(_ times: UInt) {
        for _ in 0..<times {
            let _ = Date()
        }
    }
}

このメソッドの処理時間をXCTestで計測します。

import XCTest
@testable import SampleCalculatePerformance

class SampleCalculatePerformanceTests: XCTestCase {
    // 単純にブロック内の処理の時間を計測
    func testCalculatePerformance() {
        measure {
            let viewController = ViewController()
            viewController.loop(100000)
        }
    }
    
    // 計測対象からViewControllerの初期化を除外する
    func testCalculatePerfomanceManual() {
        measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
            let viewController = ViewController()
            
            startMeasuring()
            viewController.loop(500000)
            stopMeasuring()
        }
    }
}

結果

XCTestのテストを実行しました。結果は下記のスクリーンショットの通りとなります。

f:id:fjswkun:20180212123331p:plain

サンプルのダウンロード

Google Driveに保存しています。

SampleCalculatePerformance.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に関する記事

【iOS Swift入門 #307】Viewの一部の角だけを角丸にする

はじめに

iOS11からViewの一部の角だけを角丸にすることができるようになった。今までは、一部の角だけを角丸にしようとすると、CALayerをいろいろ操作して作る必要があった。面倒なので、画像を作って対応してしまうこともあったと思います。

Viewの一部の角だけを角丸にする

CALayerにmaskedCornersプロパティが追加されました。CACornerMaskの配列を設定することができます。CACornerMaskは下記4つが用意されています。

CACornerMask

  • layerMaxXMaxYCorner 右下の角
  • layerMaxXMinYCorner 右上の角
  • layerMinXMaxYCorner 左下の角
  • layerMinXMinYCorner 左上の角

例えば、下記のように設定します。

// 右上の角と左上の角を丸くする
subview.layer.cornerRadius = 50
subview.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]

サンプル

実際に使ってます。 Single Page Viewでプロジェクトを作成し、角丸のサブビューを画面に追加します。追加はviewDidLoadメソッドの中に追加しました。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.darkGray
    
        let subview = UIView(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 100, height: 100)))
        subview.center = view.center
        subview.backgroundColor = UIColor.yellow
        
        // 右上の角と左上の角を丸くする
        subview.layer.cornerRadius = 50
        subview.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
        
        view.addSubview(subview)
    }
}

実行すると下記の画面が表示されます。 f:id:fjswkun:20180127130201p:plain

サンプルダウンロード

下記のリンクからダウンロードできます。

SamplePartialCornerRadius.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に関する記事

【iOS Swift入門 #306】ライトニングケーブルが無くても実機でビルドできるようになった(Xcode9、ワイヤレスビルド)

はじめに

Xcode9でライトニングケーブルが無くても実機でビルドできるようになりました。Wifiで同じネットワークに接続して入ればビルドできます。つまり、ワイヤレスでビルドできるようになったということです。これで開発作業のためにライトニングケーブルを持ち歩く必要がなくなりました。

準備

ただし、初回はライトニングケーブルで実機をつなぎ、設定をしてあげる必要があります。

  1. 実機をMacとライトニングケーブルでつなぎます

  2. Xcodeの[Window] - [Devices and Simulators]を開きます f:id:fjswkun:20171222175641p:plain

  3. 接続している実機を選択し、[connect via network]にチェックをいれます f:id:fjswkun:20171222175804p:plain

これでライトニングケーブルなしで、Wifi経由でビルドできます。 ビルドする実機(or シミュレータ)を選択するところで、ワイヤレスを表すマークが表示されます。

f:id:fjswkun:20171222180803p:plain

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に関する記事

【iOS Swift入門 #305】アプリ独自の色(Color)定義をAssetCatalogで管理する

はじめに

Xcode9になり、色の定義をAssetCatalogで管理できるようになりました。

これにより以下のメリットがあります。

  • 色定義の管理方法の選択肢が増えた
  • どのような色なのか一目でわかります

どのような色なのか一目でわかるという点についての補足

Asset Catalog上の表示

f:id:fjswkun:20171210123319p:plain

StoryboardやXIBファイルで色のプロパティを設定するときに選択肢に表示されます

f:id:fjswkun:20171210123513p:plain

実装例

  1. AssetCatalogにColor Setを追加します f:id:fjswkun:20171210122927p:plain

  2. 色を定義します f:id:fjswkun:20171210123052p:plain

  3. 色を使う UIColor(named:)で初期化して使います。
    ナビゲーションバーの色に使ってみました。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.navigationController?.navigationBar.barTintColor = UIColor(named: "appBlue")
    }
}

また、Storyboardで指定することもできます。 f:id:fjswkun:20171210124617p:plain

  1. 結果を確認する f:id:fjswkun:20171210123858p:plain

注意

UIColor(named:)で初期化する際に引数に色定義の名前文字列で指定します。指定が間違っていた場合、nilとなります。色定義の名前はenumで管理し、実装時に間違えないようにするなどの工夫は必要です。

また、depoyment targetが11.0以上でなければなりません。

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に関する記事

【iOS Swift入門 #304】iOS11でペースト処理をやりやすくなった(copy paste)

iOS11でのペーストの変更点

iOS11でペーストが使いやすくなりました。

主な変更点

  • UIPasteCongifurationでペーストで受け入れるデータを指定できるようになりました
  • UIResponderを継承しているクラスでpaste(itemProviders: )メソッドを実装できるようになりました

受け入れるデータの指定

UIPasteConfigurationSupportingプロトコルのpasteConfigurationプロパティで指定します。 UIResponderクラスを継承したクラスはUIPasteConfigurationSupportingプロトコルを実装しているので、初期化の際などに指定します。

pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [受け入れるデータのID])

paste(itemProviders: )メソッドの実装

下記2つの実装が必要となります。

  • NSItemProviderReadingプロトコルの実装
  • paste(itemProviders: )の実装

実装例

サンプルの概要

コピー 画像とテキストを含むクラスがコピーされます。

ペースト クラスがペーストされます。 f:id:fjswkun:20171209232111p:plain

ペースト後 f:id:fjswkun:20171209232101p:plainf:id:fjswkun:20171209232118p:plain

コピーを実行する画面

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var imageView: CopyImageView!
    @IBOutlet weak var textField: UITextField!
    
    var item: Item = {
        let imageName = "IMG_6617.jpg"
        let text = "テストアイテム"
        
        return Item(image: UIImage(named: imageName)!, text: text)
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        imageView.image = item.image
        textField.text = item.text
    }
    
    // オブジェクトをDataにエンコードしてコピーする
    override func copy(_ sender: Any?) {
        let data = NSKeyedArchiver.archivedData(withRootObject: item)
        UIPasteboard.general.setData(data, forPasteboardType: Item.itemId)
    }
}

コピー・ペーストするモデルクラス

import Foundation
import UIKit

enum ItemError: Swift.Error {
    case failedEncoding
}

class Item: NSObject, NSCoding {
    // ペースト時に受け入れるID
    static let itemId: String = "com.example.item"
    
    let image: UIImage
    let text: String
    
    required init(image: UIImage, text: String) {
        self.image = image
        self.text = text
        super.init()
    }
    
    public func encode(with aCoder: NSCoder) {
        aCoder.encode(UIImagePNGRepresentation(image), forKey: "image")
        aCoder.encode(text, forKey: "text")
    }
    
    public required convenience init?(coder aDecoder: NSCoder) {
        guard let data = aDecoder.decodeObject(forKey: "image") as? Data,
            let image = UIImage(data: data),
            let text = aDecoder.decodeObject(forKey: "text") as? String
            else {
                return nil
        }
        self.init(image: image, text: text)
    }
}

extension Item: NSItemProviderReading {
    static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self {
        switch typeIdentifier {
        case Item.itemId:
            guard let item = NSKeyedUnarchiver.unarchiveObject(with: data) as? Item else {
                throw ItemError.failedEncoding
            }
            return self.init(image: item.image, text: item.text)
        default: throw ItemError.failedEncoding
        }
    }
    
    static var readableTypeIdentifiersForItemProvider: [String] {
        return [Item.itemId]
    }
}

ペーストを実行する画面

import UIKit

class SecondViewController: UIViewController {
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [Item.itemId])
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func paste(itemProviders: [NSItemProvider]) {
        itemProviders.forEach {
            $0.loadObject(ofClass: Item.self){ object, _ in
                guard let item = object as? Item else {
                    return
                }
                DispatchQueue.main.async { [weak self] in
                    guard let `self` = self else { return }
                    self.imageView.image = item.image
                    self.textField.text = item.text
                }
            }
        }
    }
}

ダウンロード

Googleドライブに保存しています。 ダウンロードして詳細を確認してください。

SampleCopyPaste.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に関する記事

【iOS Swift入門 #303】RxRealmを使って、設定変更後、即時に表示に反映するサンプル

はじめに

  • RxRealmはRealmをRxSwiftでラップしている
  • Realmのデータ変更をObservableで取得できるところが便利

この記事について

Realmに保存された設定値を監視し、変更されたら、即時に表示を即時に変更することをやりたい

RxRealm

github.com

完成イメージ

  1. 初期表示 f:id:fjswkun:20170717164058p:plain

  2. 左バーボタンをタップ f:id:fjswkun:20170717164136p:plain

「青」をタップ

  1. 「青」タップ後の表示 f:id:fjswkun:20170717164218p:plain

  2. 右バーボタンをタップ f:id:fjswkun:20170717164346p:plain

「緑」をタップ

  1. 「緑」タップ後の表示 f:id:fjswkun:20170717164426p:plain

実装

ナビゲーションバーに関する設定値をRealmに保存する。設定が変更されたら、即時にその設定を表示に反映させる

import UIKit
import RealmSwift
import RxRealm
import RxSwift

class ViewController: UIViewController {
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        do{
            let realm = try Realm()
            
            // ナビゲーションバーの設定値をサブスクライブ
            let navigationBarColor = realm.objects(Setting.self).filter("key=%ld", SettingKey.navigationBarColor.rawValue).first!
            Observable.from(object: navigationBarColor)
                .map{ color in return ColorParam(rawValue: color.param)?.uicolor ?? ColorParam.empty.uicolor }
                .subscribe(onNext: { self.navigationController?.navigationBar.backgroundColor = $0 })
                .disposed(by: disposeBag)

            // tintカラーの設定値をサブスクライブ
            let tintColor = realm.objects(Setting.self).filter("key=%ld", SettingKey.tintColor.rawValue).first!
            Observable.from(object: tintColor)
                .map{ color in return ColorParam(rawValue: color.param)?.uicolor ?? ColorParam.empty.uicolor }
                .subscribe(onNext: { self.navigationController?.navigationBar.tintColor = $0 })
                .disposed(by: disposeBag)
            
        }catch(let e){ print(e.localizedDescription) }
    }

    @IBAction func tapLeftBarButton(_ sender: UIBarButtonItem) {
        let sheet = UIAlertController(title: "上部バーの背景色の変更", message: "変更する色を選択してください", preferredStyle: .actionSheet)
        let actions = ColorParam.all.map{ param -> UIAlertAction in
            let action = UIAlertAction(title: param.name, style: .default){ _ in
                let selected = Setting()
                selected.key = SettingKey.navigationBarColor.rawValue
                selected.param = param.rawValue
                
                do{
                    let realm = try Realm()
                    try realm.write {
                        realm.add(selected, update: true)
                    }
                }catch(let e){
                    print(e.localizedDescription)
                }
            }
            return action
        }
        actions.forEach{ sheet.addAction($0) }
        present(sheet, animated: true, completion: nil)
    }

    @IBAction func tapRightBarButton(_ sender: UIBarButtonItem) {
        let sheet = UIAlertController(title: "上部バーのテキストカラーの変更", message: "変更する色を選択してください", preferredStyle: .actionSheet)
        let actions = ColorParam.all.map{ param -> UIAlertAction in
            let action = UIAlertAction(title: param.name, style: .default){ _ in
                let selected = Setting()
                selected.key = SettingKey.tintColor.rawValue
                selected.param = param.rawValue
                
                do{
                    let realm = try Realm()
                    try realm.write {
                        realm.add(selected, update: true)
                    }
                }catch(let e){
                    print(e.localizedDescription)
                }
            }
            return action
        }
        actions.forEach{ sheet.addAction($0) }
        present(sheet, animated: true, completion: nil)
    }
    
}

サンプル

SampleRxRealm.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に関する記事

【iOS Swift入門 #302】非同期処理のobservableをテストする(RxSwift, RxBlocking)

はじめに

非同期処理のobservableをテストをする場合、RxBlockingを使います。 RxBlockingはRxSwiftレポジトリに含まれていますが、RxSwiftとは別にimportする必要があります。

RxBlogkingに含まれているtoBlockingメソッドを使うと、非同期のobservableを同期のobservableに変換することができます。toBlockingメソッドを使わなくても非同期処理のテストを書くことができますが、書かなければいけないコードが多くなります。

テストコード

iTunes Search APIを使った検索処理」をテストします。 affiliate.itunes.apple.com

テスト対象

SearchAPI構造体を作成しました。

import Foundation
import RxSwift
import RxCocoa

struct SearchAPI{
    typealias JSONType = [String:Any]
    private static let baseURL = "https://itunes.apple.com/search?term="
    
    static func search(term:String) -> Observable<JSONType>{
        let urlString = baseURL + term
        let url = URL(string: urlString)!
        let request = URLRequest(url: url)
        
        return URLSession.shared.rx.response(request: request)
            .filter{ return (200 ..< 300 ~= $0.0.statusCode) }
            .map{ (_, data) -> JSONType in
                guard
                    let json = try? JSONSerialization.jsonObject(with: data, options: []),
                    let result = json  as? JSONType
                else{
                    return [:]
                }
                return result
            }
    }
}

search(term:)は与えられた検索文字列でiTunes Search APIに検索リクエストを実行します。内部ではURLSessionが使われています。URLSessionのリクエストは非同期で実行されるため、search(term:)は非同期処理となります。search(term:)メソッドをXCTestでテストします。

コード

APIJSONレスポンスにresultCountというキーがあります。有名なアーティストの名前を検索条件にすれば、たいてい1以上の値が返ってきます。この値が1以上であることをテストします。

RxBlockingを使った場合テストコード、使わない場合のテストコードを書きました。

import XCTest
@testable import SampleRx

import RxSwift
import RxTest
import RxBlocking

class SampleRxTests: XCTestCase {
    private let disposeBag = DisposeBag()
    
    // RxBlockingを使わなかった場合
    func testSearchAPI_normal(){
        let observable = SearchAPI.search(term: "johnson")
        
        var result = [String: Any]()
        let expectation = self.expectation(description: #function)
        observable.subscribe(onNext: { json in
            result = json
            expectation.fulfill()
        })
        .disposed(by: disposeBag)
        
        
        waitForExpectations(timeout: 1.0){ error in
            let resultCount = result["resultCount"] as! Int
            XCTAssertTrue(resultCount > 0)
        }
    }
    
    // RxBlockingを使った場合
    func testSearchAPI(){
        let observable = SearchAPI.search(term: "johnson")
        let result = try! observable.toBlocking().last()!
        let resultCount = result["resultCount"] as! Int
        
        XCTAssertTrue(resultCount > 0)
    }
}

RxBlockingを使ったほうがテストコードの行数が少なくなります。そのため、わかりやすいと思いませんか?

サンプル

こちらからダウンロード SampleRx.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に関する記事