【问题标题】:How To Return Nested Variable?如何返回嵌套变量?
【发布时间】:2022-01-21 02:08:43
【问题描述】:

我不知道如何从以下函数返回变量。

这里是代码...

downloadData.setOnClickListener {

            val handler = Handler(Looper.getMainLooper())
            handler.post {
                val fetchData =
                    FetchData("http://localhost/xampp/CRM/PHP/show_contacts_db.php")

                if (fetchData.startFetch()) {
                    if (fetchData.onComplete()) {
                        val result = fetchData.data.toString()
                        
                        Log.i("FetchData", result)
                        

                        val companyName = result.substringAfter("Name: ").substringBefore(";")
                        showContactName.text = "${companyName}"
                        val companyNumber = result.substringAfter("Number: ").substringBefore(";")
                        showContactNumber.text = "${companyNumber}"
                    }
                }
            }
        }

companyNamecompanyNumber 需要返回,以便我可以在其他地方使用它。

当我尝试使用 Return companyNumber 时,我收到一条消息,这里不允许“返回”。

【问题讨论】:

  • 看看at this example。一般来说,一个好的方法是将这些值传递给另一个处理它们而不是返回它们的函数,或者将它们设置为类成员。

标签: android android-studio kotlin return return-value


【解决方案1】:

通常使用 lambda,您不会显式地 return 一个值 - lambda 返回最后一个表达式的值。以您的代码为例(它实际上不会工作,但我们会解决的!):

handler.post {
    ...
    companyNumber
}

这与 map 调用等方法采用转换函数的方式相同

listOf(1, 2, 3).map { it * 2 }

这只是将每个数字加倍,但结果被隐式返回并存储在结果列表中,对吗?它可以让你将 lambda 链接在一起,因为每个都会计算一个值(如果它“不返回结果”,它可能是 Unit

如果您愿意,可以显式使用所谓的合格返回

handler.post {
    ...
    return@post companyNumber
}

你在哪里命名你要返回的函数调用。

Kotlin docs: returning a value from a lambda expression


此外,如果您想返回两个值,则不能这样做 - 因此您必须将它们捆绑在一个对象中。你可以只返回一个Pair,或者创建一个更具可读性的数据类:

return@post Pair(companyName, companyNumber)

//or
data class CompanyDeets(val name: String, val number: String)
...
return@post CompanyDeets(companyName, companyNumber)

但是除了你一般是怎么做的,你为什么要在这里返回任何东西? Handler#post 接受 Runnable 不返回任何内容(void 在 Java 中),View.OnClickListener#onClick 也不返回任何内容。

他们都不会对你返回的值做任何事情 - 如果你明确地返回一个值,这意味着你的 lambda 签名 不匹配 (现在它隐式返回 Unit 以匹配调用者期望什么),你会得到一个错误

您可能想要做的是在您的类(Activity 或其他)中创建一个使用您的数据的函数,例如 fun doSomethingWith(companyName: String, companyNumber: String) 并在您的 lambda 中调用它。这就是您执行代码以响应点击的方式

【讨论】:

    【解决方案2】:

    只需在全局中声明 var Company Name,或使用该参数创建一个函数

    var companyName: 字符串? = 空

    handler.post { ... companyName = result.substringAfter("名称:").substringBefore(";") }

    handler.post { ... 保存(result.substringAfter(“名称:”).substringBefore(“;”)) }

    fun save(companyName: String){ ... }

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2012-12-27
      • 2014-07-05
      • 2020-03-19
      • 2020-02-25
      相关资源
      最近更新 更多