2016-12-28 5 views
0

私は、Javaでこのコードを持っている場合ヌルチェックの条件が

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

はそれがあるので、Kotlinコードを書くためのより良い方法はあり、ここで示したように、私はKotlinに変換している
return mFingerprintManager.hasEnrolledFingerprints() && 
     createKey(DEFAULT_KEY_NAME, true) && 
     initCipher(mCipher, DEFAULT_KEY_NAME); 

もっと簡潔ですか?変数mCipherは、クラスレベルで

private var mCipher: Cipher? = null 

と定義されています。

+0

はなぜKotlinにおけるJavaコードの作品ですしないよう? 'initCipher'は' Boolean'を返しませんか? – mfulton26

+0

問題は、KotlinがmCipherがnullチェックとinitCipherのアクセスの間で変更されている可能性があるとKotlinが不平を言うことです。 – Francesc

+1

'initCipher'の署名を見るといいでしょう – voddan

答えて

3

?. null可能な受信者は、受信者がnullでない場合は関数の結果を返し、そうでない場合はnullを返します。

.applyと、これは私たちが書くことができる組み合わせ:

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

+1

クール、ありがとう - 私は適用のリターンを利用することができなかったことを忘れました。 – Francesc

+0

この状況では 'let'を使う方が良いでしょう。 – voddan

0

待って、なぜあなたはKotlinにJavaコードをコピー&ペーストすることはできませんか?それはそのまま動作します。そのパラメータとしてnullを扱うことができる

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

initCipher(...)場合、あなたはメソッドに渡す前mCipherをチェックする必要はありません。

更新:

あなたがKotlinに、JavaからinitCipherを変換しましたが、今ではその引数としてnullを受け入れることができないようです。その後、あなたはmCipherへの同時アクセスを持っていないと仮定すると、コードにヌル・アサーション!!を追加します。

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