像Swift一样如何在Kotlin中进行警戒让语句?

时间:2019-04-13 20:40:35

标签: kotlin

我想像Swift一样在Kotlin中编写警卫let语句。

例如:

guard let e = email.text , !e.isEmpty else { return }

有任何建议或示例代码吗?

4 个答案:

答案 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

简单而简短