На этом шаге мы рассмотрим задание и использование таких свойств.
Кроме функций-расширений, добавляющих новые возможности, также можно объявлять свойства-расширения. Добавьте еще одно расширение для String в Extensions.kt, на этот раз свойство-расширение, подсчитывающее гласные.
val String.numVowels get() = count { "aeiouy".contains(it) } fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) . . . .
Рис.1. Добавление свойства-расширения (Extensions.kt)
Испытайте свое новое свойство-расширение numVowels в main().
val String.numVowels get() = count { "aeiouy".contains(it) } fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun <T> T.easyPrint(): T { println(this) return this } fun main(args: Array<String>) { "Madrigal has left the building".easyPrint().addEnthusiasm().easyPrint() 42.easyPrint() "How many vowels?".numVowels.easyPrint() }
Рис.2. Использование свойства-расширения (Extensions.kt)
Запустите Extensions.kt. Вы увидите вывод нового свойства numVowels:
Madrigal has left the building Madrigal has left the building! 42 5
Рис.3. Результат работы приложения
Ранее мы говорили, что свойства класса (кроме вычисляемых свойств) имеют поля, в которых хранятся фактические данные, и для них автоматически создаются методы чтения, а если надо - методы записи. Подобно вычисляемым свойствам, свойства-расширения не имеют полей. Для них должны явно определяться операторы get() и/или set(), вычисляющие возвращаемое значение.
Например, нельзя объявить такое свойство:
var String.preferredCharacters = 10
error: extension property cannot be initialized because it has no backing field
Зато можно объявить свойство-расширение preferredCharacted с методом чтения для val prefferedCharacters.
На следующем шаге мы рассмотрим расширения для типов с поддержкой null.