Wie negiere ich einen booleschen Ausdruck, wenn ich den elvis-Operator in Kotlin verwende?

8

Ich möchte den folgenden Ausdruck negieren:

return SpUtils.loadEMail()?.isEmpty() ?: false

Wenn ich ein! vor dem Ausdruck, wie

return !SpUtils.loadEMail()?.isEmpty() ?: false

Die IDE (Android Studio) sagt mir

  

Nur sichere (?.) oder nicht-null-bestätigte (!!.) Aufrufe sind auf einem nullbaren Empfänger vom Typ kotlin.Boolean?

erlaubt

Wie negiere ich diese Art von Ausdrücken?

    
lukle 17.12.2015, 10:20
quelle

2 Antworten

6

Sie haben Probleme mit der Nullwert-Referenz.

%Vor%

Dieser Code erzeugt einen Wert vom Typ Boolean? , der mit seinem Ausdruck eine Instanz von Boolean oder null zurückgeben kann.

Ich schlage folgenden Code vor, um Ihr Problem zu lösen:

%Vor%

Sie versuchen negieren Boolean? anstelle von Boolean , das elvis operator kehrt zurück!

    
IRus 17.12.2015, 10:44
quelle
2

?. ist ein sicherer Anrufoperator .

In diesem Fall gibt es Sie zurück:

  • Boolescher Wert, wenn das Ergebnis von loadEmail() Aufruf nicht null
  • ist
  • null andernfalls

! ist eine eingebaute Boolesche Operation, die package.Boolean aufruft. s-Operator namens not() , der nur für Referenzen funktioniert, die nicht nullfähig sind. Das Ergebnis von ?. ist Boolean? , daher erhalten Sie Ihren Fehler.

Wenn Sie den gesamten Ausdruck negieren möchten, können Sie sich an die iRus-Antwort halten:

%Vor%

Wenn Sie nur den SpUtils().loadEMail()?.isEmpty() -Teil negieren möchten, lautet die korrekte Variante:

%Vor%

Wenn das Ergebnis von ?. null ist (es gibt keine Mail), wird der elvis-Operator Ihnen true (keine E-Mail) zurückgeben und Sie werden es negieren.

    
aga 17.12.2015 11:39
quelle

Tags und Links