Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何像斯威夫特一样在科特林做守卫让声明?_Kotlin - Fatal编程技术网

Kotlin 如何像斯威夫特一样在科特林做守卫让声明?

Kotlin 如何像斯威夫特一样在科特林做守卫让声明?,kotlin,Kotlin,我想像斯威夫特一样,用科特林写一份警卫放行声明 例如: guard let e=email.text!e、 isEmpty else{return} 有什么建议或示例代码吗 试试看 val e = email.text?.let { it } ?: return val e = email.text ?: run { // do something, for example: Logging return@outerFunction } 解释:检查属性email.text是

我想像斯威夫特一样,用科特林写一份警卫放行声明

例如:

guard let e=email.text!e、 isEmpty else{return}
有什么建议或示例代码吗

试试看

val e = email.text?.let { it } ?: return
val e = email.text ?: run {
    // do something, for example: Logging
    return@outerFunction
}
解释:检查属性
email.text
是否为
null
。如果不为null,则赋值并移动到执行下一条语句。否则它将执行
return
语句并中断该方法

编辑:按照@dyukha在评论中的建议,您可以删除冗余的
let

val e = email.text ?: return
如果要检查任何其他条件,可以使用Kotlin的
If
表达式

val e = if (email.text.isEmpty()) return else email.text
或者尝试(如@Slaw所建议的)


您也可以尝试使用此处实现的
guard
功能:

如果您希望重新创建swift的功能,即展开多个选项,然后使用展开的变量,那么我有一个稍微不同的解决方案

考虑在Kotlin文件中添加这些行


    inline fun <T1, T2, T3, R> guard(
        p1: T1?, p2: T2?, p3: T3?,
        condition: Boolean = true,
        block: (T1, T2, T3) -> R
    ): R? = if (p1 != null && p2 != null && p3 != null && condition)
        block(p1, p2, p3)
    else null

    inline fun <T1, T2, T3, T4, R> guard(
        p1: T1?, p2: T2?, p3: T3?, p4: T4?,
        condition: Boolean = true,
        block: (T1, T2, T3, T4) -> R
    ): R? = if (p1 != null && p2 != null && p3 != null && p4 != null && condition)
        block(p1, p2, p3, p4)
    else null
你现在可以这样使用它了

    guard(firstName, lastName, email, password){ fName, lName, mail, pword ->            
        createUser(fName, lName, mail, pword) // all your variables are unwrapped!
    } ?: return // <- here if you want an early return

    // or
    guard(firstName, lastName, email, password,
        condition = email.isValid 
    ) { fName, lName, mail, pword -> 
        // N.B this will not execute if the email is not valid
        createUser(fName, lName, mail, pword)
    }
guard(名字、姓氏、电子邮件、密码){fName、lName、mail、pword->
createUser(fName、lName、mail、pword)//所有变量都已展开!
}?:返回//
//注意:如果电子邮件无效,则不会执行此操作
createUser(fName、lName、mail、pword)
}
由于此函数是内联的,您可以将其与协同程序一起使用,并且可以从
块返回值并使用它。

尝试

val e = email.text?.let { it } ?: return
val e = email.text ?: run {
    // do something, for example: Logging
    return@outerFunction
}

如果您想在
返回之前执行其他操作

是“guard let”还是“if let”?是的,有点:)然后检查那个链接。它可能有答案。请阅读,然后。您使用了几个含义不同的标记(即和),还有一些与问题无关(swift;不要标记源语言-问题是关于Kotlin,而不是swift)为什么不干脆
email.text?:return
?Agreed@dyukha。更甜蜜!但问题中的情况不同,不是吗?我不太明白guard let
的作用,但似乎你应该检查
email.text
是否为空,而不是空。更新了我的答案。如果你仍然想使用elvis运算符,你可以使用:
val e=email.text.takeIf{it.isNotEmpty()}?:return
。这是最好的答案,但并不完美,因为let是无用的。val e=email.text?:运行{//执行某些操作,例如:日志记录return@outerFunction}看起来很有希望,我得试试。