u16suzuの blog

日々学んだことのメモブログです。

swift でシングルトンクラスをつくってみる

シングルトンクラスの定義

  • 遅延実行で生成するパターン
import Foundation

class NetworkErrorAlertControllerManager : NSObject {

    static var sharedManager: NetworkErrorAlertControllerManager = {
        return NetworkErrorAlertControllerManager()
    }()
    
    override private init() {
    }
    
    func hoge(){
        
    }
}

シングルトンクラスのメソッドの呼び出し

NetworkErrorAlertControllerManager.sharedManager.hoge()

よく使うクエリパラメータ系のメソッドを使い回せるようにする

ページネーションがあるAPIを作るとき毎回書くのが大変なので共通化した。 base_controller.rb に書いておくと、他のコントローラから使い回せて便利。

def params_page
  params[:page].try(:to_i).presence || 1
end

def params_site_ids
  params["site_ids"].try(:split, "_" ).presence || []
end

セマンティックバージョニング2.0.0

仮にバージョンを A.B.C としたとき

  • A: メジャーバージョン 後方互換性を持たない機能追加
  • B: マイナーバージョン 後方互換性を保つ機能追加
  • C: パッチバージョン 後方互換性を保つバグ修正

参考

セマンティック バージョニング 2.0.0

あるクラスのインスタンスメソッドの一覧を取得する

class Human
  def say
    p "hello"    
  end
end

p Man.instance_methods(false)
# => [:say, :age=]

任意のクラスが include しているモジュール一覧を表示

p Array.included_modules
# => [Enumerable, Kernel]

ContainerViewController のスニペット

import UIKit

class ParentViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    // コンテナビューコントローラに追加
    func addViewController(vc: UIViewController){
        self.addChildViewController(vc)
        vc.view.frame = self.view.frame // 子ビューのframe を設定する必要がある
        self.view.addSubview(vc.view)
        vc.didMoveToParentViewController(self)
    }
    
    // コンテナビューコントローラから削除
    func removeViewController(vc: UIViewController){
        vc.willMoveToParentViewController(nil)
        vc.view.removeFromSuperview()
        vc.removeFromParentViewController()
    }
    
}

手順通り追加処理をしないと, contentViewController の viewDidLoad がよばれなかった。

参考

github.com

https://developer.apple.com/jp/documentation/ViewControllerPGforiOS.pdf