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}看起来很有希望,我得试试。