はじめに
公式の問題集「Kotlin Koans」を解きながらKotlinを学習します。
過去記事はこちら
- Introduction
- Classes
- Conventions
問題
DateRangeクラスにIterable<MyDate>
を実装して、反復処理できるようにします。DateUtil.kt で定義されている MyDate.followingDate()
関数を使用します。
次の日付を見つけるロジックを独自に実装する必要はありません。
オブジェクト式は、KotlinではJavaの無名クラスと同じような役割を担っています。
修正前のコード
class DateRange(val start: MyDate, val end: MyDate)
fun iterateOverDateRange(firstDate: MyDate, secondDate: MyDate, handler: (MyDate) -> Unit) {
for (date in firstDate..secondDate) {
handler(date)
}
}
問題のポイント
Kotlinのforループは、対応するイテレータメンバーや拡張関数があれば、どんなオブジェクトでも反復処理することができます。
解答例
class DateRange(val start: MyDate, val end: MyDate):Iterable<MyDate> {
override fun iterator(): Iterator<MyDate> {
return object : Iterator<MyDate> {
var current: MyDate = start
override fun next(): MyDate {
if (!hasNext()) throw NoSuchElementException()
val result = current
current = current.followingDate()
return result
}
override fun hasNext(): Boolean = current <= end
}
}
}
fun iterateOverDateRange(firstDate: MyDate, secondDate: MyDate, handler: (MyDate) -> Unit) {
for (date in firstDate..secondDate) {
handler(date)
}
}