2017-01-26 25 views
5

バックエンドはnullを返しますInt? null値を書き込むにはどうすればよいですか?kotlinの空白の値を書き込みます

date class Foo (var value: Int?){ 
    constructor(source: Parcel) : this(
    source.readInt() 
    ) 

    override fun writeToParcel(dest: Parcel, flags: Int) { 
    dest.writeInt(value) // doesn't compile - writeInt expect no null value 
    } 
} 

は今、私は解決策を得た。その後、

dest.writeInt(value?: -1) 

そして-1

チェックしたり、文字列のようなのIntを書き、その後...

の値を使用しますが、私はそれがだと思います醜いと間違っている。

解決済み!私の答え:

source.readValue(Int::class.java.classLoader) as Int?, 
dest.writeValue(value) 
+0

'dest.writeInt(値が!!)'動作しません:によって解決さ

val parcelHasValueByte = source.readByte() val parcelHasValue = parcelHasValueByte != 0 if (parcelHasValue) { value = source.readInt() } else { value = null } 

+0

!! - 発生するnullポイント受信とクラッシュ! – Yvgen

+1

質問に対する回答が見つかった場合は、回答として投稿し、それを受け入れる必要があります。 – Bryan

答えて

3

?あなたがParcelに `null`値を渡してもアンドロイドは気にしません。
2

これは主に、あなたのNULL可能プロパティの値としてnullの意味が何であるかに依存します。これが意味することができます。

  • valueがnullの場合、それは存在せず、すべてで書かれるべきではありません。もちろん

    value?.let { writeInt(it) } 
    

    それが読まなければならない場合、Parcel受信機は、決定することができるはずですこれは以前に書かれた値からは明らかです。

  • valueは、いくつかのコードによって提供され、そしてそれは、それが書かれなければならない点でヌルである場合は、エラーである:

    check(value != null) { "value should be not null at the point it's wriiten" } 
    writeInt(value!!) 
    

    また、この場合、lateinit var代わりにNULL可能性を使用することを検討します。

  • いくつかのデフォルト値

    valueの代わりに使用する必要があります。

    Parcel
    writeInt(value ?: someDefaultValue()) 
    

    、これは値が欠落している場合はそうでない場合、あなたはどこか別の事実を指定する必要があるため、意味を成しません。

  • ...(nullが実際に多くのことを意味することができます)

また、this answerはNULL値を扱う多くの慣用的な方法を示しており、あなたはそれらのいくつかが役に立つかもしれません。

+0

"値がnullの場合、それは存在せず、まったく書き込まれてはいけません" "はい、ただし、*何かをアンマーシャリングするときにこの不在についても知る必要があります。 –

1

は、Googleが安全にヌル文字列をマーシャリングするために、サービスの利用を再生するものを考えてみましょう:

String NULL = "SAFE_PARCELABLE_NULL_STRING"; 

これは技術的にnull文字列ではない、チームは意味的にこの文字列がnullに等しいことを決めました。

リストを操作するときも同様の手法を使用します。まず、リストの長さを持つwriteIntです。これは、リストがnullであることを示すために-1である場合があります。

-1を使用して整数が存在しないかどうかは、スキーマによって異なります。あなたのユースケースでは-1が有効な値ですか?そうである場合は、Int.MINまたはInt.MAXのようにnullを表す別の値を見つけなければなりません。

これらの値の全てが有効な範囲内にある場合は、そのように別の値を使用する:非整列化するとき

val hasValue: Boolean = value != null 
val hasValueByte: Byte = if (value != null) 1 else 0 
dest.writeByte(hasValueByte) 
if (hasValue) dest.writeInt(value) 

は、これらの例のいずれかを忘れてはいけません!

source.readValue(Int::class.java.classLoader) as Int?, 
dest.writeValue(value) 
関連する問題