我有一个稍微不同的解决方案,如果您希望重新创建 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
(我确实有 p9,但为简洁起见保存了它)
这意味着你现在做
//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返回一个值并使用它。