2016-12-28 81 views
0

我在Java中,這代碼空檢查中如果條件

return mFingerprintManager.hasEnrolledFingerprints() && 
     createKey(DEFAULT_KEY_NAME, true) && 
     initCipher(mCipher, DEFAULT_KEY_NAME); 

如下所示

return mFingerprintManager.hasEnrolledFingerprints() && 
     createKey(DEFAULT_KEY_NAME, true) && 
     if (mCipher != null) { 
      mCipher?.apply { initCipher(this, DEFAULT_KEY_NAME) } 
      return true 
     } else { 
      return false 
     } 

有沒有更好的方式來寫科特林代碼,所以它是一個我已經轉化爲科特林更簡潔?變量mCipher定義爲

private var mCipher: Cipher? = null 

在類級別。

+0

爲什麼不科特林Java代碼工作的是什麼? 'initCipher'沒有返回一個'Boolean'嗎? – mfulton26

+0

問題是Kotlin抱怨mCipher可能在null檢查和initCipher中的訪問之間發生了變化。 – Francesc

+1

很高興看到'initCipher' – voddan

回答

3

?.如果接收方不爲null,則返回函數的結果,否則返回null。

結合這與.apply我們可以這樣寫:

[..] && mCipher?.apply { initCipher(this, DEFAULT_KEY_NAME) } != null

+1

的簽名很酷,謝謝 - 我錯過了我可以利用apply的返回。 – Francesc

+0

在這種情況下使用'let'會更好。 – voddan

0

等待,你爲什麼不能複製 - 粘貼Java代碼科特林?這將作爲-是:

return mFingerprintManager.hasEnrolledFingerprints() 
     && createKey(DEFAULT_KEY_NAME, true) 
     && initCipher(mCipher, DEFAULT_KEY_NAME) 

如果initCipher(...)可以處理null作爲它的參數,那麼你就需要將它傳遞給方法之前檢查mCipher

更新:

看來你已經轉換initCipher從Java到科特林,現在不能接受null作爲其參數。然後,假設你不必mCipher併發訪問,添加一個空斷言!!的代碼:

return mFingerprintManager.hasEnrolledFingerprints() 
     && createKey(DEFAULT_KEY_NAME, true) 
     && initCipher(mCipher!!, DEFAULT_KEY_NAME)