Intereting Posts
Предупреждение ARM: использование swp {b} устарело для этой архитектуры Проект библиотеки Android-поддержки-v7-appcompat не будет работать Как остановить процесс, запущенный run.exec () в android Почему событие touchstart после клика? Android Studio – нет возможности связывать C ++ с Gradle Панель действий не показана с помощью AppCompat SetUserAgentString в веб-браузере Android не влияет на заголовок HTTP, используемый в loadURL () Proguard не запутывает приложения для Android Ошибка компиляции в «Использовать Facebook Войти» SDK Как обнаружить неиспользуемые ресурсы в Xamarin.Android? Получите контактное имя с указанием номера телефона в Android Как я могу выбрать контакт из журнала вызовов? Зажигание Kindle Fire и повреждение текстуры со скоростью 60 кадров в секунду Получение ошибки «Активность Java.lang.IllegalStateException была уничтожена» при использовании вкладок с ViewPager Намерение перейти на страницу настроек для конкретной учетной записи

Классы данных Kotlin и типы NULL

Я новичок в Kotlin, и я не знаю, почему компилятор жалуется на этот код:

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 , а не String? , Поэтому я не понимаю, почему я должен поставить ? Когда я хочу проверить длину.

Выражение test?.data.length эквивалентно (test?.data).length , а часть test.data имеет значение NULL: это либо test.data либо null . Поэтому для его length небезопасно, но вместо этого вы должны снова использовать оператор безопасного вызова : test?.data?.length .

Нулевая способность распространяется по всей цепочке вызовов: вам нужно написать эти цепочки как a?.b?.c?.d?.e (что опять же эквивалентно (((a?.b)?.c)?.d)?.e ), потому что, если одна из левых частей равна нулю, остальные вызовы не могут выполняться так, как если бы значение не было нулевым.

Если вы не хотите использовать безопасный вызов перед каждым невообразимым компонентом цепочки вызовов, вы можете получить результат первого безопасного вызова в новую переменную с run стандартных стандартных функций:

 // `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 по-прежнему недействителен Int? Вот.