積読消化1 さわって、学べる!iOSテスト駆動開発

TDDとは

f:id:tiking76:20200826115445p:plain

まさにこの図!!

  1. Red → これから実装する機能に対する失敗するテスト
  2. Green → 失敗したコードを成功させるための最低限の実装コードを書く
  3. Refactor → 外部から見たときに動作を変えずに実装コードを洗練する

目的

動作する綺麗なコードを書くため!

テストの種類

f:id:tiking76:20200826115510p:plain

サンプルアプリをやる際の注意

  • window関係は今はAppdelegate.swiftに書かず、Scenedelegate.swiftに書く
  • テストもしっかりターゲットに入れてあげる

    f:id:tiking76:20200826115543p:plain

    やり方

Xcodeの右サイドバーだして、ファイルを開いてる時にビルドターゲットのセレクトボックスがあると思うので、そこでアプリケーションにチェック入ってなければチェック入れてもう一回やってみるとか

  • コードの説明
let window = UIWindow()
window.makeKeyAndVisible()

なにをやっているのか

レシーバのUIWindowを key window とし、かつ同一の level にあるウィンドウの中で最も前面に表示してくれるメソッドということがわかります。key window というのはアプリに同時に1つまで存在できる、タッチ操作に関係しないイベントを受け取るウィンドウの事のようです(タッチ操作イベントはそれが起こったウィンドウに送られます)。level というのはウィンドウの前後関係を示す Z 軸座標を表しています。

詳細はわかりませんが、makeKeyAndVisible()はあくまでレシーバを key window とし、(level が同じまたはそれ以下のウィンドウの中で)優先表示するもので、どこかから新たに参照を持たれないことになんとなく納得しました。

AutoLayoutをコードでやる際のtips

NSLayoutConstraintのisActive

NSLayoutConstraintのプロパティのisActiveを使います。例を示します。

let widthConstraint = aView.widthAnchor.constraint(equalToConstant: 100) widthConstraint.isActive = true // aView.widthAnchor.constraint(equalToConstant: 100).isActive = ture でもOK

ここで再び以下の画像を考えてみます。viewBとviewCはviewAのsubviewです。

f:id:tiking76:20200826115629p:plain

isActiveを使うとviewBとviewCの横幅が等しい制約を有効化する方法は以下のようになります。

let widthEqualConstraint = viewB.widthAnchor.constraint(equalTo: viewC.widthAnchor) widthEqualConstraint.isActive = true viewA.constraints.contains(widthEqualConstraint) // => true

3行目に注目してください。widthEqualConstraintがviewAに所属していることを示しています。このように、isActiveを使うとその制約がどのviewに所属するべきかを自動的に解決してくれます。制約を解除したいときはisActive = falseとしてやればOKです。非常に便利ですね。

参考にしました🙏

booth.pm

qiita.com

サンプルアプリのコード

github.com