在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
当前回答
如果让我们使用内联的乐趣,我们可以得到像Swift一样的unwring语法
inline fun <T:Any?> T?.unwrap(callback: (T)-> Unit) : Boolean {
return if (this != null) {
this?.let(callback)
true
}else {
false
}
}
用途::
val name : String? = null
val rollNo : String? = ""
var namesList: ArrayList<String>? = null
if (name.unwrap { name ->
Log.i("Dhiru", "Name have value on it $name")
})else if ( rollNo.unwrap {
Log.i("Dhiru","Roll have value on it")
}) else if (namesList.unwrap { namesList ->
Log.i("Dhiru","This is Called when names list have value ")
}) {
Log.i("Dhiru","No Field have value on it ")
}
其他回答
这是我的变体,仅限于非常常见的“if not null”情况。
首先,在某个地方定义它:
inline fun <T> ifNotNull(obj: T?, block: (T) -> Unit) {
if (obj != null) {
block(obj)
}
}
它可能应该是内部的,以避免冲突。
现在,转换这个Swift代码:
if let item = obj.item {
doSomething(item)
}
到这个Kotlin代码:
ifNotNull(obj.item) { item ->
doSomething(item)
}
请注意,在Kotlin中,你可以删除参数并使用它:
ifNotNull(obj.item) {
doSomething(it)
}
但是如果代码块超过1-2行,最好是显式的。
这是我所能找到的最相似的斯威夫特。
上面有两个答案,都得到了很多人的接受:
str ?。让{}?:运行{} str ?。还有{}?:run {}
两者似乎都适用于大多数用法,但#1在下面的测试中会失败:
第二条似乎更好。
与Swift不同的是,在Kotlin中使用它之前,不需要打开可选选项。我们可以检查该值是否为非空,编译器会跟踪您执行的检查信息,并允许将其作为解包装使用。
迅速:
if let a = b.val {
//use "a" as unwrapped
} else {
}
在芬兰湾的科特林:
if b.val != null {
//use "b.val" as unwrapped
} else {
}
更多这样的用例请参考Documentation:(null-safety)
如果b是一个成员变量,那么这种方法对我来说似乎是最有可读性的:
val b = this.b
if (b == null) {
return
}
println("non nullable : ${b}")
这也与它在swift中的工作方式一致,在swift中,一个新的局部变量遮蔽了成员变量。
Swift如果让声明在Kotlin
简短的回答是使用简单的IF-ELSE,因为在这篇评论的时候,在Kotlin LET中没有等效的东西,
if(A.isNull()){
// A is null
}else{
// A is not null
}