連続アニメーション

下記の例は、先に画像を2倍に拡大して、次左に90度回転して、更に右に180度回転して、最後元に戻るアニメーションです。

let scaleTransform = CGAffineTransform(scaleX: 2, y: 2)
let leftRotateTransform = scaleTransform.concatenating(CGAffineTransform(rotationAngle: -.pi / 2))
let rightRotateTransform = scaleTransform.concatenating(CGAffineTransform(rotationAngle: .pi / 2))
UIView.animateKeyframes(withDuration: 2, delay: 0, animations: {
    UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.25) {
        imageView.transform = scaleTransform
    }
    UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.25) {
        imageView.transform = leftRotateTransform
    }
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.25) {
        imageView.transform = rightRotateTransform
    }
    UIView.addKeyframe(withRelativeStartTime: 0.75, relativeDuration: 0.25) {
        imageView.transform = CGAffineTransform.identity
    }
}

要注意のは、animateKeyframeswithDurationは秒単位が、下のaddKeyframewithRelativeStartTimerelativeDurationはパーセンテージ単位。
例えばUIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.25)の意味は全体時間の50%の時点で、次25%の時間内動く。
そして二つのtransform同時に発生する時はconcatenatingで繋がる。

Priority Queue

Priority Queueはelementを追加時自動的にソートできる便利なコレクションである。一部のLeetCode問題ではPriority Queueを使わないとタイムアウトが発生する。(e.g. 問題502問題1834問題1962

これからPriority Queueの使い方を紹介します。例えば、今Personというdata classがある。

data class Person(val name: String, val age: Int)

年齢昇順のPriority Queue定義

val queue = PriorityQueue<Person> { p1, p2 -> p1.age - p2.age }

または

val queue = PriorityQueue<Person>(compareBy { it.age })

年齢降順のPriority Queue定義

val queue = PriorityQueue<Person> { p1, p2 -> p2.age - p1.age }

または

val queue = PriorityQueue<Person>(compareByDescending { it.age })

elementの追加

queue.add(Person("Cecil", 18))

先頭elementの取得および削除

val queue = PriorityQueue<Person>(compareByDescending { it.age })
queue.add(Person("Cecil", 18))
queue.add(Person("Eric", 19))
queue.add(Person("Rachit", 17))
val oldestPerson = queue.peek() // Ericを取得、queueの変化なし
val oldestPerson = queue.poll() // Ericを取得、且つqueueからEricが削除される