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

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

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でメソッドを引っ付ければ問題ないのだが…

入る学科間違えたと気付いた時にはもう遅かった

地獄を生きていくこのサバイバル高専生活果たしてどう生きていく