我想像Swift一样在Kotlin中编写警卫let语句。
例如:
guard let e = email.text , !e.isEmpty else { return }
有任何建议或示例代码吗?
答案 0 :(得分:5)
尝试
val e = email.text?.let { it } ?: return
说明:这将检查属性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建议)。
val e = email.text.takeIf { it.isNotEmpty() } ?: return
您可能还希望尝试使用此处实现的guard
功能:https://github.com/idrougge/KotlinGuard
答案 1 :(得分:2)
尝试
val e = email.text ?: run {
// do something, for example: Logging
return@outerFunction
}
如果您想在return
之前做其他事情。
答案 2 :(得分:0)
如果您要重新创建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
(我确实有多达9个,但为简洁起见保存了它)
这意味着您现在要做
//given you have
var firstName: String? = null
var lastName: String? = null
var email: String? = null
var password: String? = null
fun createUser(name: String, lname: String, mail: String, pword: String) {
// some work
}
您现在可以像这样使用它
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)
}
内联此函数后,您可以将其与协程一起使用,并且可以从block
返回一个值并使用它。
答案 3 :(得分:0)
我用过这个:
it ?: return
简单而简短