2015-12-17 23 views
8

Tôi muốn phủ nhận biểu thức sau đây:Làm thế nào để phủ nhận một biểu thức boolean khi sử dụng toán tử elvis trong kotlin?

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

Nếu tôi thêm một! trước khi các biểu hiện, như

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

Các IDE (Android Studio) nói với tôi

Chỉ an toàn (?). hoặc không null khẳng định (!!). cuộc gọi được phép trên một nullable người nhận loại kotlin.Boolean?

Làm cách nào để phủ nhận loại biểu thức này?

+2

Như một lưu ý phụ, đó cũng là hàm '.not()' mà bạn có thể sử dụng với toán tử cuộc gọi an toàn, ví dụ: 'SpUtils.loadEMail() ?. isEmpty() ?. not()' –

Trả lời

6

Bạn có vấn đề với tham chiếu nullable.

SpUtils.loadEMail()?.isEmpty() 

Mã này tạo ra giá trị loại Boolean? biểu thức trung bình đó có thể trả về một thể hiện của Boolean hoặc null.

Tôi đề nghị sau mã để giải quyết vấn đề của bạn:

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

Bạn đang cố gắng phủ nhận Boolean? thay vì Boolean, trả về toán tử elvis!

+0

Xem ghi chú từ @cypressious cho tùy chọn '.not()'. Nếu không, bạn phải luôn xem xét ưu tiên toán tử khi bạn xây dựng một biểu thức. –

2

?.safe call operator.

Trong trường hợp này nó sẽ trả về bạn:

  • giá trị boolean nếu kết quả của loadEmail() gọi không phải lànull
  • null khác

! là một hoạt động boolean built-in mà gọi các Nhà điều hành của package.Boolean được gọi là not() chỉ hoạt động về các tham chiếu không có giá trị. Kết quả của ?.Boolean?, do đó bạn gặp lỗi của mình.

Nếu bạn muốn phủ nhận toàn bộ biểu thức, bạn có thể dính vào câu trả lời iRus:

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

Nếu bạn muốn phủ nhận chỉ phần SpUtils().loadEMail()?.isEmpty() thì biến đúng sẽ là:

!(SpUtils().loadEMail()?.isEmpty() ?: true) 

Nếu kết quả của ?. sẽ không có giá trị (không có thư) thì toán tử elvis sẽ trả lại cho bạn true (không có e-mail) và bạn sẽ từ chối nó.

+1

Bạn không cần toán tử elvis thứ hai trong ví dụ cuối cùng của bạn nữa. Phía bên trái đã là 'Boolean' và không phải là 'Boolean?', Hay tôi đang nhìn cái gì đó? – mhlz

Các vấn đề liên quan