事始め
アプリ開発で気を付けることの記事では、Android/iOSに関係なくアプリ開発における基本的な考え方について整理しましたが、こちらではiOSアプリ開発特有の観点について整理したいと思います。アプリ開発で気を付けることと同様に、簡潔・単純明快を心がけ、詳細については別記事に譲ることとします。
Storyboard、Xib関連
気を付けること
- Storyboardは可能であれば1画面1Storyboardが良いと思います(参考:1画面1Storyboardのススメ)
- 使い回したいViewはStoryboardからXibに分割すると便利です
- 複雑な画面などもXibに分けておくと分かりやすくなります
- 不要なView要素がないか確認し、あれば削除しましょう
- コードとの紐付け(IBAction、IBOutlet)でコード上での操作が不要なものは削除した方が良いでしょう
- コミットを入れる前に、他のDevice上での表示や縦横表示を確認しておきましょう(直近であれば特にiPhoneX)
- 初期化処理はStoryboard/コードのどちらかに統一して記載するのが望ましいです(どちらで初期化されているのかは見てみないとわからなくなってしまうので)
個人的な見解
まだ Storyboard で消耗してるの?——Re:ゼロから始める視覚表現(ビジュアルリプリゼンテーション)やStoryboardなんか使わない方がいいなどにも記載されてますが、個人的にもStoryboardはあまり使いたくない派です。デメリットについては調べればいくらでも出てくると思います。ただ、簡単で静的なViewについてはStoryboard/Xibで実装するのもありだと思っています。そうした際には以上の点について気を付けながら実装を行っています。
コード関連
- nilだった場合の処理が適切なのかどうか確認しましょう
- 配列の要素外アクセスが起きないことを確認しましょう
- (Swift)強制アンラップは基本的に使用しないようにしましょう
- 要らないコメントは削除しましょう
- TODOコメントにはチケット(Issue)番号を記載しておくのがオススメです
- TODOやFIXMEなどは単純なコメントではなくアウトライン表示しましょう(参考:Swiftでクラスのアウトライン表示(区切り線やTODO))
- delegateやblocks(closure)内のselfは弱参照にしましょう(参考:Swiftの循環参照問題におけるunownedとweakの使い分けについて)
- delegateとblocks(closure)は適切に使い分けしましょう(参考がないので最下部に少し記載)
- SwiftからObjective-Cの変数にアクセスする際に強制アンラップのままになっていないか確認しましょう(デフォルトだと全て強制アンラップされます)
- Lintツール(SwiftLint、OCLint)やコードフォーマッター(Swimat、Clang-format)を有効活用しましょう
- 何でもかんでもViewDidLoadに詰め込んでいないか確認しましょう
- 意外とタイポは見逃されがちなので気を付けましょう(コンパイラも教えてはくれません)
その他
- 不要なContents.jsonは削除しましょう(よく無駄なContents.jsonが作成されていることがあります)
- OSSを使用する際は正しく利用しましょう。よくライセンス表記に漏れが生じるので、LicensePlist というiOSアプリ利用ライブラリのライセンス一覧を生成するツールを作りました などを参考に自動化するのも一つの手です
delegateとblocks(closure)の使い分けについて
参考になる記事が「Blocks or Delegation?」みたいなタイトルでブログがあったと思うのですが、消えてたので軽く翻訳して抜粋しておきます。
- 複数の異なるイベントが発生する場合はdelegateを使用する(blocksだと大体1つか2つになる。delegateは色々なイベントを一気に委譲できるという違いがある)
- シングルトンになっているobjectがイベントを発生させる場合はblocksを使用する(インスタンスが一つなので、delegateの付け外しが大変なことになる)
- 追加情報を求める為のコールバックにはdelegateを使用する(UITableViewDataSourceなど)
- プロセスに沿って情報を取得するような場合はdelegate、結果を取得するような場合はblocksを使用する(これはどうでしょうね、個人的には途中経過の処理もblocksで良いと思います)