『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

SwiftのProtocolでTraitを実装する ~ Reachabilityでのサンプル ~

はじめに

久しぶりにブログでプログラミングの記事を書くような気がする...
今回は趣味で開発しているアプリでTraitを実装することがあったのでそれのアレ

Trait とは 形質
実装し終わったら「あ〜そういう意味か。」というような納得できました。ミックスイン的なやつらしいです。

内容

  • Reachabilityを使って各UIViewControllerでネットワークステータスを確認する
  • ネットワークステータスに変更があればそれに対応した動作をさせる

ざっとこれ

準備

  • Xcodeプロジェクトの作成
  • ReachabilityをDLして打ち込む 公式

サンプル

CustomViewController.swift

import UIKit

class CustomViewController: UIViewController {

    fileprivate var reachability = Reachability.forInternetConnection()

    override func viewDidLoad() {
        super.viewDidLoad()
        reachability?.startNotifier()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChange(_:)), name: NSNotification.Name.reachabilityChanged, object: nil)
    }

    deinit {
        reachability?.stopNotifier()
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.reachabilityChanged, object: nil)
    }

    ・・・

    // MARK: - Reachability's notification target method

    func networkStatusChange(_ sender: Notification) {
        let networkStatus = reachability?.currentReachabilityStatus()
        if networkStatus == NotReachable {
            return
        }
        something()
    }
}

だいたいこんな感じの内容
今回はオンラインになったときに以下で作成する something() メソッドを呼び出す形

UIViewController+Reachability.swift

とりあえずクラス拡張としてファイルを生成しました。

import UIKit

protocol ReachabilityStatusChange {
    func something()
}

// これをコメントアウトした場合は、各UIViewControllerに付加することで同じような処理が可能
extension UIViewController : ReachabilityStatusChange {}

extension ReachabilityStatusChange where Self : UIViewController {

    func something() {
        print("オンラインになった!")
    }
}

最後に

これですべて動作させたいクラスファイルに関して something() メソッドの実装を書くことがなくなった。幸せになれた。

ぶっちゃけUIViewControllerにそのままextensionでメソッドを引っ付ければ問題ないのだが...