以前Objective-C向けに公開した記事をSwiftに置き換えたいと思います。
[対象記事はこちら]
https://qiita.com/yu_okb/items/dc7cce9504b43805b065
スクリプトみたいにViewController.swiftにダラダラ記述して後で他メンバーが保守するときに大変な思いをするより、初見でわかりやすい・保守しやすいコードの方が断然良い。そのためにやっている手法があるので、自身の備忘録に残しておく。
おおまかに伝えたいことだけ先に言うと、機能ごとに関数を疎結合にし、ライフサイクルの上に乗せて動かすように意識すると良い。
やりたいこと
ViewやModel、Controllerなどを最小単位として列挙することで、あとで各処理を見直す際に確認が容易になる。処理を最小単位に書くことで同時に認識しやすくなり、保守が比較的楽になる。Swift版。
ご指摘あればよろしくお願いします。
ポイント
- viewDidLoadで余計な初期化をしない
- 1 機能につき1 関数を定義する(ケースによるが)
- MARKを正しく記載する
- 最小単位に処理を分けて関数化することでユニット単位でテストができる
手順
- 各処理を最小単位で関数化し記述する
- MARKを記載する
import UIKit
class ViewController: UIViewController,
UITableViewDelegate,
UITableViewDataSource
{
@IBOutlet var tableView: UITableView!
var data: NSMutableArray = []
// MARKを書くことでXCode上から定義関数がインデックスされる
//MARK: Life Cycle
override func viewDidLoad()
{
// 余計な初期化は行わない
// 目的に応じてラップした関数を呼び出す
super.viewDidLoad()
getData()
setView()
}
//MARK: UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
// セクション数設定処理
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
// cell描画処理
}
//MARK: Private
private func getData()
{
data = []
:
// データ取得処理をここに書く
// entityクラスを別途定義する
}
//MARK: Private View
func setView()
{
// 例えばテーブルビューのみ動作を確認したい場合に"setTableView"以外をコメントアウトすると
// テーブルビューのみの動作確認ができる
setNavigationBar()
setMainView()
setTableView()
setToolBar()
}
func setNavigationBar()
{
// ナビゲーションを実装する
}
func setMainView()
{
// view関連の実装
}
func setTableView()
{
// tableViewを実装するために必要な処理を書き出す
tableView = UITableView(frame: CGRect(x: view.frame.origin.x,
y: view.frame.origin.y, width: view.frame.size.width, height: view.frame.size.height))
tableView.dataSource = self
:
view.addSubview(tableView)
}
func setToolBar()
{
// ツールバーを実装する
}
}
:
//MARK:
定義する関数の順序は以下の順で書くのが一般的。
それに従って//MARK:を記述する
Editにおける見出しの付け方Objective-Cでは#pragmaだが、Swiftでは「コメントアウトにMARK」を記述するだけ。
Obj-C : #pragma
Swift : //MARK:
MARKに関して、以下が表示されれば成功です。

基本的なカテゴリは以下になると思います。
- Initialize
- Life Cycle
- Delegate
- Gesture
- Private
まとめ
各関数がそれぞれ疎結合になっていると関数同士の因果関係が明確になり、どこでバグが出ているのかを追いやすくなる。