2017-02-03 7 views
7

내가 코 틀린에 새로운 해요 및 컴파일러는이 코드에 대해 불평 이유를 모르겠어요 :코 틀린 데이터 클래스 및 nullable 형식

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

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

컴파일러 test?.data.length과 불평은, 내가해야한다고 말한다 : test?.data?.length. 그러나 데이터 변수는 이 아니라 String이므로 길이를 확인하려고 할 때 왜 ?을 넣어야하는지 이해할 수 없습니다.

답변

10

발현 test?.data.length(test?.data).length는 등가이며, 일부는 널 test?.data : 그것은 test.data 또는 null 중입니다. 따라서 length을 얻는 것이 null 안전하지 않지만 safe call operator을 다시 사용해야합니다 (test?.data?.length).

null 가능성은 전체 호출 체인을 통해 전파됩니다.이 체인을 a?.b?.c?.d?.e (다시 말하면 (((a?.b)?.c)?.d)?.e과 동일)으로 작성해야합니다. 왼쪽 파트 중 하나가 null이면 나머지 호출을 값이 널이 아닌 것처럼 수행 될 수 있습니다.

+0

이제 알았습니다. 대단히 고마워! –

3

당신이 호출 체인의 각 null이 허용되지 않는 구성 요소를하기 전에 안전 호출을 사용하지 않으려면, 당신은 표준 확장 기능 run 또는 let에 새로운 변수로 최초의 안전 호출의 결과를 얻을 수 있습니다

// `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은 여전히 ​​null 허용 가능 Int?입니다.

+0

대단히 고마워! –