Kotlin for循环为defined by convention:
Kotlin中的一些语法形式是defined by convention,这意味着它们的语义是通过将一种语法形式扩展为另一种语法形式来定义的.
对于for(VarDecl in C) Body
,它扩展到的语法形式是:
when(val $iterator = C.iterator()) {
else -> while ($iterator.hasNext()) {
val VarDecl = $iterator.next()
<... all the statements from Body>
}
按规定here in the spec.
不需要特定的接口,只需要重载解析为iterator()
、hasNext()
和next()
找到适当的operator
个重载.作为一个极端的例子,这个编译!
fun main() {
for (s in Foo()) { // no error here!
}
}
class Foo {
operator fun iterator(): Bar = Bar()
}
class Bar {
operator fun hasNext() = false
operator fun next() = ""
}
在您的情况下,有exists个用于Map
的扩展函数iterator
:
operator fun <K, V> Map<out K, V>.iterator(): Iterator<Entry<K, V>>
和MutableMap
:
@JvmName("mutableIterator")
operator fun <K, V> MutableMap<K, V>.iterator(): MutableIterator<MutableEntry<K, V>>
iterator
方法不必在Map
中声明-只要重载解析可以解决它,for循环就可以工作.这同样适用于next
和hasNext
.
因此,要使您自己的类使用for循环,您至少需要声明:
operator fun iterator(): Iterator<Something>
但我仍然建议您实现Iterable
,因为这样您就可以免费获得所有Iterable
个扩展函数:)