Kotlin:For循环必须有一个迭代器方法 - 这是一个错误吗?

时间:2015-03-22 23:35:03

标签: arrays kotlin

我有以下代码:

public fun findSomeLikeThis(): ArrayList<T>? {
    val result = Db4o.objectContainer()!!.queryByExample<T>(this as T) as Collection<T>
    if (result == null) return null
    return ArrayList(result)
}

如果我这样称呼:

var list : ArrayList<Person>? = p1.findSomeLikeThis()

for (p2 in list) {
    p2.delete()
    p2.commit()
}

它会给我错误:

  

For循环范围必须有一个&#39; iterator()&#39;方法

我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:41)

您的ArrayList属于可空类型。所以,你必须解决这个问题。有几种选择:

for (p2 in list.orEmpty()) { ... }

 list?.let {
    for (p2 in it) {

    }
}

或者您只需返回一个空列表

public fun findSomeLikeThis(): List<T> //Do you need mutable ArrayList here?
    = (Db4o.objectContainer()!!.queryByExample<T>(this as T) as Collection<T>)?.toList().orEmpty()

答案 1 :(得分:2)

试试

for(p2 in 0 until list.count()) {
    ...
    ...
} 

答案 2 :(得分:0)

当我循环一些不是数组的东西时,我也会遇到这个问题。
例子

for (int x = 0; x < rows; x++)
    for (int y = 0; y < cols; y++)
        for (int i = 0; i < flattenedGrid.size(); i++)
            grid[x][y] = flattenedGrid[i];

此问题的情况不同,但希望对您有帮助

答案 3 :(得分:0)

当您从共享的首选项中读取并获得(可能为)可空的可迭代对象(如StringSet)时,这也会在Android中发生。即使提供默认值,编译器也无法确定返回的值永远不会为空。我发现这种情况的唯一方法是使用!!运算符断言返回的表达式不为null,如下所示:

val prefs = PreferenceManager.getDefaultSharedPreferences(appContext)
val searches = prefs.getStringSet("saved_searches", setOf())!!
for (search in searches){
    ...
}