kotlin — как создать обнуляемое логическое значение в разделяемом

#kotlin #nullable #parcelable

#kotlin #обнуляемое #разделяемое

Вопрос:

Наличие разделяемого класса с обнуляемым логическим элементом memembr по умолчанию равно null

можно было бы сделать это следующим образом

 parcel.writeByte(if (isAllowed==null) -1 else (if (isAllowed) 1 else 0))
  

но как получить его обратно и передать в конструкторе?

Есть ли лучший способ сериализовать / десериализовать обнуляемое логическое значение?

   class Config(val isAllowed: Boolean?=null, val startPos: Int=-1 ) : Parcelable {
      constructor(parcel: Parcel) : this(
        parcel.readByte() != 0.toByte(),
        parcel.readInt()


      override fun writeToParcel(parcel: Parcel, flags: Int) {
          parcel.writeByte(if (isAllowed) 1 else 0)
          parcel.writeInt(startPos)

      }
......
  

Ответ №1:

Вы можете использовать .let{} для возврата вычисленного значения.

 constructor(parcel: Parcel) : this(parcel.readByte().let { if(it < 0) null else (it > 0) },parcel.readInt())
  

Ответ №2:

Вам нужен способ создать a Config из a Parcel , но это не обязательно должен быть конструктор, даже если большинство примеров делают это. В вашем CREATOR :

 fun createFromParcel(parcel: Parcel): Config {
    val parcelByte = parcel.readByte()
    val isAllowed = if (parcelByte < 0) null else parcelByte > 0
    val startPos = parcel.readInt()
    return Config(isAllowed, startPos)
}
  

Очевидно, что это может быть извлечено в fun Parcel.read(write)NullableBoolean() , если вам это понадобится более одного раза.

Или просто используйте @Parcelize 🙂