Help us understand the problem. What is going on with this article?

SwiftのProtocolでTraitを実装する

More than 3 years have passed since last update.

はじめに

今回は趣味で開発しているアプリでTraitを実装することがあったのでそれのアレ

Trait とは 形質

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

内容

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

ざっとこれ

環境

  • 情弱社会人2年目iOSエンジニア
  • Pythonが好き
  • Xcode 8.3.3
  • Swift 3.1
  • macOS Sierra 10.12.4

準備

  • Xcodeプロジェクトの作成
  • ReachabilityをDLして打ち込む 公式
    • 公式のものなのでCocoaPods, Carthageなどで入れたやつとかは知らない!!

サンプル

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()
    }
}

// MARK: - ReachabilityStatusChange

extension CustomViewController : ReachabilityStatusChange {}

だいたいこんな感じの内容

今回はオンラインになったときに以下で作成する something() メソッドを呼び出す形

UIViewController+Reachability.swift

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

import UIKit

protocol ReachabilityStatusChange {
    func something()
}

// これをコメントインした場合は、すべてUIViewControllerに反映される
// extension UIViewController : ReachabilityStatusChange {}

extension ReachabilityStatusChange where Self : UIViewController {

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

最後に

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

何か間違い等あればご指摘いただけると幸いです:;(∩´﹏`∩);:

nnsnodnb
いいか?Pythonだけを信じろ
https://nnsnodnb.hatenablog.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away