Освоюємо Kotlin

завершено на 0%
Матеріал з Вікіпідручника

Kotlin - об'єктно-орієнтована мова програмування, що функціонує поверх віртуальної машина Java (JVM). З 7 травня 2019 року є рекомендованою мовою програмування для розробки Android застосунків.

Змінні[ред.]

Оголошення змінних[ред.]

Оголошення змінних відбувається з вказанням ключового слова var після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Для оголошення констант використовується ключове слово val взамін var.

var x=5 //оголошення цілочисельної змінної
val y=5 //оголошення константи
var num: Int // оголошення цілочисельної змінної з прямим вказанням типу
var hugeNumber = 6L //створення змінної типу Long
var hugeNumber2: Long =6 //теж саме 
var isVar= true // створення змінної типу Boolean
var letter='D' //змінна типу Char
var name="Tom" // змінна типу String
var x=3.14 // змінна типу Double

Типи змінних[ред.]

Цілочисельні типи представлені типами Byte, Short, Int та Long.

Тип Біт Діапазон значень
Byte 8 біт -128 до 127
Short 16 біт –32768 до 32767
Int 32 біт –2147483648 до 2147483647
Long 64 біт -9 223 372 036 854 775 808 () до 9 223 372 036 854 775 807 ( - 1)

Дробові числа представлені типами Float (32 біта) та типом Double (64 біта).

Для представлення символів використовується тип Char.

var letter='D'

Для представлення рядків використовується тип String.

var name ="John"

Boolean змінні застосовуються для значень true або false.

var isMan = true

Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong):

var x:UInt=5u;

Перетворення типів[ред.]

Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній).

var k=65 // створиться змінна типу Int
var l:Long = k.toLong() //до типу Long

Масиви[ред.]

Робота з масивами здійснюється наступним чином:

var myArray = arrayOf(1, 2, 3) // оголошення масиву з трьома числами типу Int
println(myArray[0]) // звернення до першого (нульового) елемента масиву
println (myArray.size) // отримання розміру масива
var myArray2: Array<Byte>=arrayOf(2,3,4) // явне вказання типу масиву

Якщо масив визначається не з допомогою ключового слова var, а з допомогою val, то створену змінну не можна буде перенаправити на інший масив. При цьому елементи масиву можна змінювати.

Привіт Світе![ред.]

Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java.

fun main(args: Array<String>){ // вказання аргументів функції необов'язкове
    val message="Привіт, Світе!"
    println (message) // якщо виводимо лише значення змінної
    println ("Ми говоримо: $message") //якщо вставляємо змінну в рядок
}

Результат:

Привіт, Світе!
Ми говоримо: Привіт, Світе!

Зверніть увагу, що для вставляння змінної в рядок використовується знак $

Конструкція if[ред.]

Конструкція if пишеться так:

    var x=5;
    if (x==5) {
        println ("співпало")
    }

Якщо після умови йде лише одна інструкція, то фігурні дужки можна опустити.

Зверніть увагу, що перевірка умови на рівність іде з подвійним дорівнює, тобто з оператором ==, а не одним. Одне дорівнює означає присвоєння.

Також можна додавати інструкцію else і створювати складні перевірки умови:

    if (x>0) {
        println ("додатнє число")
    } else if (x<0) {
        println ("від'ємне число")
    } else println ("ні додатнє, ні від'ємне (0)")

В Kotlin if можна використовувати для повернення значення.

   println (if (x>0) "додатнє число"
           else if (x<0) "від'ємне число"
           else "ні додатнє, ні від'ємне (0)")

в даному випадку кожна секція конструкції if повертає текстовий рядок, який виводиться інструкцією println.

Функції[ред.]

Оголошення функції в Kotlin із параметрами відбувається із вказанням ключового слова fun і вказанням назв параметрів і їхніх типів:

fun max(a: Int, b: Int){
    println(if (a>b) a else b)
}

Викликати функцію із функції main можна так:

fun main(args: Array<String>) {
    max(4, 1)
}

Якщо потрібно повернути певне значення із функції, то після дужок і двокрапки вказується тип значення, що повертається:

fun max(a: Int, b: Int):Int{
    return if (a>b) a else b
}

Компілятор строго контролюватеме чи ви передаєте аргументи правильного типу у функцію, тобто якщо написати max("a", 3.14), то видасть помилку.

Якщо функція не повертає ніякого значення, то можна вказати ключове слово Unit замість типу. Але це не обов'язково, можна нічого не вказувати.

fun max(a: Int, b: Int):Unit{
    println(if (a>b) a else b)
}
//або так
fun max(a: Int, b: Int){
    println(if (a>b) a else b)
}

Якщо функція складається з одного рядка, то фігурні дужки можна опустити і написати так:

fun max(a: Int, b: Int) =  println(if (a>b) a else b)

Змінні оголошені в середині функції є локальними і видимими лише в цій функції.

Параметри створюються як val, тобто є константами і їм неможливо перепризначити значення:

fun myFunction(message: String){
message = "Hi!" // помилка
}

Цикли[ред.]

Цикл while[ред.]

Звичний цикл з передумовою while працює в Kotlin як і в інших мовах:

var x=1
while (x<20){
   x=x+1
}

Цикл for[ред.]

Цикл for дозволяє здійснити перебір чисел в певному діапазоні і має вигляд:

for (x in 1..15){
    //код програми
}

Якщо потрібно, щоб останній елемент не включався використовують замість .. ключове слово until:

for (x in 1 until 100) println(x)  // виведе числа від 1 до 99

Зверніть увагу, що якщо цикл складається з одного рядка, то фігурні дужки можна опустити.

Для перебору в зворотньому порядку використовується ключове слово downTo.

for (x in 15 downTo 1) println(x)

Якщо потрібно перебирати не з одиничним кроком, то можна використати ключове слово step для задання кроку перебору.

for (x in 1..100 step 2) println(x)

Існує можливість перебрати всі елементи масиву наступним чином:

var myArray: Array<Byte> = arrayOf(1, 2, 3)
for (item in myArray){
    println("myArray has $item")
}

Можна перебрати масив використовуючи його індекси:

    var myArray: Array<Byte> = arrayOf(1, 2, 3)
    for (index in myArray.indices){
        println("$index =${myArray[index]}")
    }

Більш того, можна одночасно пройтися і по індексам і по значенням масиву:

    var myArray: Array<Byte> = arrayOf(1, 2, 3, 5)
    for ((index, item) in myArray.withIndex()){
        println("[$index] =$item")
    }

Результат останнього шматка коду:

[0] =1
[1] =2
[2] =3
[3] =5

Об'єктно орієнтоване програмування (ООП)[ред.]

Визначення простого класу[ред.]

Клас - це спеціальна конструкція, яка об'єднує в собі змінні та функції. Змінні називаються полями класу або ж властивостями. Найпростіший клас Song з двома функціями play() та stop() можна визначити так:

class Song(val title: String, val artist: String) {
    fun play() {
        println("Playing the song $title by $artist")
    }
    fun stop() {
        println("Stopped playing $title")
    }
}

При такому визначенні класу ми можемо звертатися на пряму до його полів title та string, та до його функцій використовуючи змінну типу Song, яка звертається на відповідний екземпляр класу.

fun main(args: Array<String>) {
    val song1=Song("We Will Rock You", "Queen") //створення екземпляру класу
    val song2=Song ("No Roots", "Alice Merton") //створенння другого екземпляру класу
    println(song1.title) //прямий доступ до поля
    song1.play() //виклик функції play()
    song1.stop()//виклик функції stop()
}

Результат виконання:

We Will Rock You
Playing the song We Will Rock You by Queen
Stopped playing We Will Rock You

Поле може бути змінюваним, оголошеним з ключовим словом var або ж незмінюваним - val.

Визначення полів в тілі класу[ред.]

Можна вручну присвоїти значення полям використовуючи параметри, які передаються конструктору. В такому разі перед параметрами конструктора не вказуються ключові слова var та val. Це дає змогу зробити додаткові дії перед присвоєнням полям значення. Наприклад, перевести рядок тексту у верхній регістр. Можна також окремо оголошувати поля, яких немає в конструкторі.

class Song(title_param: String, artist_param: String) {
    var title=title_param //присвоїти значення взяти з конструктора
    var artist=artist_param.uppercase() //рядок до верхнього регістру
    var playable =true // додаємо нове поле

    fun play() {
        println("Playing the song $title by $artist")
    }
    fun stop() {
        println("Stopped playing $title")
    }
}
fun main(args: Array<String>) {
    val song1=Song("We Will Rock You", "Queen")

    println(song1.title) //прямий доступ до поля title
    println(song1.artist) // прямий доступ до поля artist
    println("playable="+song1.playable) //прямий доступ до поля playable
    song1.play()
    song1.stop()
}

Результат виконання:

We Will Rock You
QUEEN
playable=true
Playing the song We Will Rock You by QUEEN
Stopped playing We Will Rock You