# 2021-02-18 | Android | Kotlin
###### tags: `kotlin` `android` `gobelins`
# Visibilité
Permet de définir la portée d'une variable / classe
* **public** : visible partout
* **private** : visible dans la classe / le fichier
* **protected** : visible par les classes filles
* **internal** : visible dans le module
# Variables
## Définition
* Variable **immuables** : contante non modifiable définit par **val**
* Varibales **mutables** : variable modifiable définit par **var**
```kotlin=
// Variable immuable
val aInt: Int = 14 // 14
aInt = 20 // Val cannot be reassigned
// Variable mutable
var aInt2: Int = 2 // 2
aInt2 = 14 // 14
```
## Typage
Le typage n'est pas obligatoire : inférence de type. Mais attention, kotlin est quand même un langage typé !
```kotlin=
val myInt = 12 // 12
var myString = "hophop" // hophop
myString = "hopla" // hopla
myString = 42 // The integer literal does not conform to the expected type String
val str: String = 56 // The integer literal does not conform to the expected type String
```
## Nullable
Par défaut, une variable n'est pas nullable. Mais on peut déclarer une variable null en ajoutant un point d'interrogation. En ajoutant ceci, la variable peut être null ou pas.
```kotlin=
val nulStr: String = null // Null can not be a value of a non-null type String
var nullableStr: String? = null // null
nullableStr = "bonjour" // bonjour
```
Puisqu'une variable peut être null, il faut ajouter des tests pour voir si la variable est null lorsqu'on veut faire une action dessus.
```kotlin=
var myString: String? = null
myString.length // Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
myString?.length // null
```
# String interpolation
Voici une méthode pour concaténer une chaine de caractères avec des variables :
```kotlin=
val name = "Dumbo"
val age = 42
val ville = "Paris"
// Concaténation simple
var myStr: String = "Hello, je m'appelle $name, j'ai $age and, et j'habite à $ville"
// Concaténation avec des formules
var mySecondStr = "Mon nom est long comme ça : ${name.length}"
```
# Fontions
La déclaration d'une fonction est constitué de 6 élémednts :
* La visibilité
* Le mot clé fun
* Le nom de la fonction
* Les paramètres
* Le type de retour
* Le code
Voici un exmeple :
```kotlin=
private fun sayHello(name: String): String {
return "Hello $name"
}
// Expression simplifiée s'il n'y a qu'une instruction
private fun sayHello(name: String): String = return "Hello $name"
```
> [color=#E35DDA]Une fonction retourne un type Unit par défaut
## Argument optionnel
On peut donner une valeur optionnelle à un argument d'une fonction. Voici un exemple :
```kotlin=
fun sum(a: Float = 12f, b: Float) = a.plus(b)
val result = sum(b = 50f)
```
# Contrôle de flow
## If / else
Voici quelques exemples :
```kotlin=
val a = 2
val b = 4
if(a > b) {
// code
} else if(a > b) {
// code
} else {
// code
}
```
## When (ou Switch)
Le When est l'équivalent du switch. Voici un exemple :
```kotlin=
val a = 2
// Simple
when(a) {
0 -> // code
2 -> // code
else -> // code
}
// Avec plusieurs valeurs
when(a) {
0,1,2 -> // code
3,4,5 -> // code
else -> // code
}
// Avec des comparaisons
when {
a > 0 -> // code
a < 0 -> // code
else -> // code
}
// Avec des plages de valeurs
when {
a in 0..10 -> // code
a in 10..25 -> // code
a > 25 -> // code
else -> // code
}
```
> [color=#E35DDA]Le else n'est pas obligatoire si tout les cas sont couverts
## Boucle for
Voici un exemple d'utilisation de la boucle for :
```kotlin=
// Incrémentation simple par défaut = 1
for(i in 0 until 10) {
println("Valeur de i : $i")
}
// Itération d'une max à une min -> décrémentation de 1
for(i in 10 downTo 0) {
println("Valeur de i : $i")
}
// En modifiant le pas
for(i in 0 until 10 step 2) {
println("Valeur de i : $i")
}
// Sur une plage de valeurs
for(i in 0..10) {
println("Valeur de i : $i")
}
```
## While
Voici un exemple d'utilisation de la bucle while :
```kotlin=
var index = 0
// Sur une plage de valeurs
while(index in 0..10) {
// code
index++
}
// Avec une valeur maximum
while(index < 100) {
// code
index++
}
```