Kotlin:
outer@for (i in 1..5) { for (j in 1..5) { println("i: $i, j: $j") if (j == 3) { continue@outer } } }
Swift:
outer: for i in 1...5 { for j in 1...5 { print("i: \(i), j: \(j)") if j == 3 { continue outer } } }
下記の例は、先に画像を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 } }
要注意のは、animateKeyframes
のwithDuration
は秒単位が、下のaddKeyframe
のwithRelativeStartTime
とrelativeDuration
はパーセンテージ単位。
例えばUIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.25)
の意味は全体時間の50%の時点で、次25%の時間内動く。
そして二つのtransform同時に発生する時はconcatenating
で繋がる。
1, 2, 3, 4, 5:
for (i in 1..5)
1, 3, 5:
for (i in 1..5 step 2)
1, 2, 3, 4:
for (i in 1 until 5)
5, 4, 3, 2, 1:
for (i in 5 downTo 1)
5, 3, 1:
for (i in 5 downTo 1 step 2)
もしリストの先頭または末尾だけ操作する場合、ArrayDequeを使え!
val fruits = listOf("apple", "banana", "pear") fruits.forEachIndexed { index, fruit -> println(index) println(fruit) }
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が削除される
100: ultraLight 200: thin 300: light 400: regular 500: medium 600: semibold 700: bold 800: heavy 900: black