我有以下代码:
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;方法
我在这里错过了什么吗?
答案 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){
...
}