如何使用 Kotlin 迭代类组件

Mur*_*lva 5 java android kotlin

我面临这个问题,我已经做了一些搜索,但没有找到答案。

我想做什么?

我正在使用 Retrofit 从 API 获取一些数据,我可以获取数据,但我想在类中执行 ForEach 来查找我需要的属性。

    data class ChampionList(
            @SerializedName("version")
        val version : String,
        @SerializedName("data")
        val data : Data) <------ wanna do the foreach in this property  
Run Code Online (Sandbox Code Playgroud)

我想这样做,或者类似的事情:(这里我得到以下错误= for循环范围必须有一个'iterator()'方法)

      for(dataChampion in ChampionList.Data){
            //do something
    }
Run Code Online (Sandbox Code Playgroud)

当我搜索时,我发现了一些关于Kotlin反射的内容,但我不明白:(

我发现但不起作用的另一件事是使用这个:

 for(data in ChampionList::class.memberProperties){
   //access data here, but got an unresolved reference for member properties
}

classes:


    data class ChampionList(
        @SerializedName("version")
        val version : String,
        @SerializedName("data")
        val data : Data)



    data class Data (
        @SerializedName("Aatrox") val aatrox : Aatrox,
        @SerializedName("Ahri") val ahri : Ahri,
        @SerializedName("Akali") val akali : Akali,
        @SerializedName("Alistar") val alistar : Alistar,
        @SerializedName("Amumu") val amumu : Amumu,
        @SerializedName("Anivia") val anivia : Anivia
    }


    data class Aatrox(

        @SerializedName("version") val version: String,
        @SerializedName("id") val id: String,
        @SerializedName("key") val key: Int,
        @SerializedName("name") val name: String,
        @SerializedName("title") val title: String,
        @SerializedName("blurb") val blurb: String,
        @SerializedName("info") val info: Info,
        @SerializedName("image") val image: Image,
        @SerializedName("tags") val tags: List<String>,
        @SerializedName("partype") val partype: String,
        @SerializedName("stats") val stats: Stats
    )
Run Code Online (Sandbox Code Playgroud)

所有其他职业,如阿狸、阿卡丽、阿利斯塔、阿木木和艾尼维亚,都与亚托克斯相同

Ale*_*nov 5

for(data in ChampionList::class.memberProperties){
    //access data here, but got an unresolved reference for member properties
}
Run Code Online (Sandbox Code Playgroud)

是正确的方法(如果您没有在类内声明任何属性并且不关心顺序),但您需要

  1. 如果您还没有,请按此处kotlin-reflect所述添加依赖项(针对 Gradle):

    implementation "org.jetbrains.kotlin:kotlin-reflect"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加import kotlin.reflect.full.memberProperties;

  3. 如果您确实关心顺序或不希望在类中包含属性,请ChampionList::class.primaryConstructor.valueParameters改为使用。


She*_*ano 0

尝试这样的事情:

for (dataChampion in data.orEmpty()) { 
    //do something
 }
Run Code Online (Sandbox Code Playgroud)

或这个:

 data?.let {
    for (dataChampion in it) {

    }
}
Run Code Online (Sandbox Code Playgroud)

我的猜测是您正在尝试迭代可空类型的数据,希望这对您有用。祝您的英雄联盟应用程序好运:)