У меня этот код в 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
на уровне класса.
?.
на приемнике с нулевым значением возвращает результат функции, если приемник не равен нулю, а null – в противном случае.
Объединяя это с .apply
мы можем написать:
[..] && mCipher?.apply { initCipher(this, DEFAULT_KEY_NAME) } != null
Подождите, почему вы не можете скопировать код Java в Kotlin? Он будет работать как есть:
return mFingerprintManager.hasEnrolledFingerprints() && createKey(DEFAULT_KEY_NAME, true) && initCipher(mCipher, DEFAULT_KEY_NAME)
Если initCipher(...)
может обрабатывать значение null
качестве его параметра, вам не нужно проверять mCipher
перед передачей его методу.
Обновить:
Кажется, что вы конвертировали initCipher
из Java в Kotlin, и теперь он не может принимать null
качестве аргумента. Затем, предполагая, что у вас нет параллельного доступа к mCipher
, добавьте null-assertion !!
к коду:
return mFingerprintManager.hasEnrolledFingerprints() && createKey(DEFAULT_KEY_NAME, true) && initCipher(mCipher!!, DEFAULT_KEY_NAME)