2017-02-03 33 views
7

Ben KOTLIN yeniyim ve derleyici bu kodu hakkında şikayet neden bilmiyorum:Kotlin veri sınıfları ve null türleri

data class Test(var data : String = "data") 

fun test(){ 
    var test: Test? = Test("") 
    var size = test?.data.length 
} 

Derleyici test?.data.length ile şikayet, bu yapmak gerektiğini söylüyor: test?.data?.length. Ancak veri değişkeni String? değil String değil, bu yüzden ben uzunluğunu kontrol etmek istediğimde neden ?'u koymam gerektiğini anlamıyorum.

cevap

10

sentezleme test?.data.length(test?.data).length eşdeğerdir ve test?.data parçası olabilecek: bu test.data veya null ya olup. Bu nedenle, length almak için null güvenli değil, bunun yerine safe call operator yeniden kullanmalısınız: test?.data?.length. nullability tamamı üzerinden yayılır

zincirini çağırır: Eğer ((((a?.b)?.c)?.d)?.e eşdeğer tekrardan,,) a?.b?.c?.d?.e olarak bu zincirleri yazmak zorunda bıraktı parçalarından biridir boşsa, aramaların kalanı olamaz, çünkü Değer boş değilse sanki gerçekleştirilmelidir.

+0

Şimdi anlıyorum. Size çok teşekkür ederim! –

3

Çağrı zincirinin her NULL olmayan bileşen önce güvenli aramayı kullanmak istemiyorsanız, standart uzatma fonksiyonları run veya let ile yeni bir değişken haline birinci güvenli çağrının sonucu alabilirsiniz:

// `this` is non-nullable `Test` inside lambda 
val size = test?.run { data.length } 

// or: `it` is non-nullable `Test` inside lambda 
val size = test?.let { it.data.length } 

size'un hala burada Int? null olduğunu unutmayın.

+0

Çok teşekkürler! –