我想否定以下表达式:
return SpUtils.loadEMail()?.isEmpty() ?: false
如果我添加一个!在表达之前,就像
return !SpUtils.loadEMail()?.isEmpty() ?: false
IDE(Android Studio)告诉我
在kotlin.Boolean类型的可空接收器上只允许安全(? . )或非空断言(!! . )调用?
我怎么否定这种表达方式呢?
你有可空引用的问题 .
SpUtils.loadEMail()?.isEmpty()
此代码生成 Boolean? 类型的值,其平均表达式可以返回 Boolean 或 null 的实例 .
我建议使用以下代码来解决您的问题:
return !(SpUtils().loadEMail()?.isEmpty() ?: false);
你尝试否定 Boolean? 而不是 Boolean ,elvis运算符返回!
?. 是safe call operator .
?.
在这种情况下,它会返回:
布尔值,如果 loadEmail() 调用的结果 is not null
loadEmail()
null
null 否则
! 是一个built-in布尔操作,它调用 package.Boolean 的名为 not() 的运算符,该运算符仅适用于非可空引用 . ?. 的结果是 Boolean? ,因此您得到错误 .
!
package.Boolean
not()
Boolean?
如果你想否定整个表达,你可以坚持iRus的答案:
!(SpUtils().loadEMail()?.isEmpty() ?: false)
如果你想否定 just SpUtils().loadEMail()?.isEmpty() 部分,那么正确的变体将是:
SpUtils().loadEMail()?.isEmpty()
!(SpUtils().loadEMail()?.isEmpty() ?: true)
如果 ?. 的结果为空(没有邮件),那么elvis操作员将返回 true (没有电子邮件),你将否定它 .
true
!(SpUtils().loadEMail()?.isEmpty() ?: false) 会起作用,但很难看出这实际上何时会返回 true .
当 SpUtils().loadEMail() 的结果为空或非空时,它返回 true . 有了这些知识,我们可以轻松地做出可读的东西:
SpUtils().loadEMail()
return SpUtils().loadEMail()?.isNotEmpty() ?: true
您可以扩展它以获得更好的可读性:
val email = SpUtils().loadEMail() if (email == null || email.isNotEmpty()) { return true } return false
3 回答
你有可空引用的问题 .
此代码生成 Boolean? 类型的值,其平均表达式可以返回 Boolean 或 null 的实例 .
我建议使用以下代码来解决您的问题:
你尝试否定 Boolean? 而不是 Boolean ,elvis运算符返回!
?.
是safe call operator .在这种情况下,它会返回:
布尔值,如果
loadEmail()
调用的结果 is notnull
null
否则!
是一个built-in布尔操作,它调用package.Boolean
的名为not()
的运算符,该运算符仅适用于非可空引用 .?.
的结果是Boolean?
,因此您得到错误 .如果你想否定整个表达,你可以坚持iRus的答案:
如果你想否定 just
SpUtils().loadEMail()?.isEmpty()
部分,那么正确的变体将是:如果
?.
的结果为空(没有邮件),那么elvis操作员将返回true
(没有电子邮件),你将否定它 .!(SpUtils().loadEMail()?.isEmpty() ?: false)
会起作用,但很难看出这实际上何时会返回true
.当
SpUtils().loadEMail()
的结果为空或非空时,它返回true
. 有了这些知识,我们可以轻松地做出可读的东西:return SpUtils().loadEMail()?.isNotEmpty() ?: true
您可以扩展它以获得更好的可读性: