Kotlin:メモ

・行末のセミコロンは省略可

・型宣言は「変数名:データ型」

・関数定義は「fun」

・変数宣言は「var」「val」
var - 書き換え可能
val - 変更不可

・型推論
var message: string = "test"

var mssage = "test"
のようにデータ型を省略できる

・if式
kotlinのifは「式」= 値を返せる
例) val ret = if(a >= 10) "bit" else "small"
… elseは省略不可

・when式
switch~caseに似た機能
例)
val value = 100
when(value){
  100 -> println("100!")
  200 -> println("200!!")
  300 -> println("300!!!")
  else -> println("ELSE")
}
val str = "aaa"
when(str){
  "aaa" -> println("aaa!")
  "bbb" -> println("bbb!!")
  else -> println("ELSE")
}
val value2 = 13
when(value2){
  in 1..10 -> println("1..10")   //1以上10以下。inと..を使って範囲指定
  11, 12 -> println("11 or 12")  //11か12。カンマで複数指定
  in 13..20 -> println("13..20") //13以上20以下
  !in 1..20 -> println("ELSE")   //「1以上20以下」以外。!を使って条件反転
}
val value3 = 13
val value4 = 5
when{ //引数無しのwhen
  value3 < 20 -> println("value3 < 20") //任意の条件式を書ける
  isEven(value3) -> println("Even")     //条件には関数なども書ける
  value4 > 0 -> println("value4 > 0")
  else -> println("ELSE")
}
val value5 = "Doi"
val value6 = when(value5){ //when式の結果を変数に代入
  "Doi" -> "土井"
  "Yamada" -> "山田"
  else -> "それ以外の人" //elseがないとコンパイル時にエラー
}
println(value6)

・for
for(i in arrayOf(1,2,3)){ //配列から1つずつ取り出す
  println(i)  //1~3を出力
}
 
//古くからの書き方はもうできない
//for(i=0;i<10;i++)
//  println(i)
 
//上記と同じ処理
for(i in 0..9){ 範囲から1つずつ取り出す
  print(i) //0~9を出力
}
 
//あるいは範囲の別記法を使ったパターン
for(i in 0 until 10){
  println(i) //0~9を出力
}
val names = arrayOf("Doi", "Yamada", "Sakurai")
 
//配列からインデックスと要素の両方を取得する
for((index, elem) in names.withIndex()){
  println("$index: $elem") //文字列に変数を埋め込んで出力(詳細は次ページで解説)
}
・文字列テンプレート
val ar1: Array = arrayOf("abc", "def", "ghi")
val name = "田中"
val age = 32;
println("Name: $name, Age: $age") //「$変数名」で文字列に埋め込める
 
//どこまでが変数名か分からないケースは{}で囲む
println("${name}さんの年齢は${age}歳です") 
//変数だけでなく、プロパティや配列の値も表示可能。その場合は必ず{}で囲む
println("配列の長さ: ${ar1.size}, 配列の値: ${ar1[2]}") 
・複数行文字列リテラル 複数行文字列リテラルを """ で囲む ・null 普通に列宣言すると「非Null型」となる Nullを許容するには「型名?」とする ・?.演算子 (安全呼び出し演算子、セーフコール演算子)
var d: String? = null
println(d?.length) //エラーは起きない。「null」が表示される
 
var e: String? = "はろはろ"
println(e?.length) //「4」が表示される
・?: (エルビス演算子) 第1項がnullではない場合には第1項を、nullの場合には第2項を返す ・!!演算子 nullチェックしていなくても、Null許容型を無理やり非Null型として扱う ・クラス インスタンス化する際newキーワードは使用しない staticメソッドは存在しない ・アクセサ
class Test() {
  var prop: Int
    get() {
      return ...
    }
    set(value) {
      ...
    }
}
・コンストラクタ プライマリコンストラクタ(init)とセカンダリコンストラクタ(constructor)がある クラスに値を渡す場合
class Test(val firstName: string, val lastName: string = "") { ...
・データクラス データのみ保持するクラス
data class Test( val firstName: String, val lastName: String = "" ) ...
・Singleton objectキーワードで生成 ・コンパニオンオブジェクト クラス内のcompanionキーワードを使ってオブジェクトを宣言 staticメソッド、static変数の代替手段として使用できる ・基底クラス Anyクラスを継承、Anyのスーパークラスは Any? ・クラス継承 継承可能なクラス "open class Animal{}" (既定ではopenが付かないため継承できない) 継承する場合 "class Cat: Animal(){}" ・オーバーライド メソッドに"open"キーワードを付ける (既定ではopenが付かないためオーバーライドできない) オーバーライドする場合 "override fun methodname() { …" ・キャスト
val cat = Cat() //「Cat」型(「Animal」型を継承)のインスタンス
val animal = cat as Animal //Animal型にキャスト

・拡張関数
クラスを継承することなく、そのクラスにメソッドを追加する
ただし、拡張関数からprivateメンバーへのアクセスはできない

・範囲
for(i in 1..10) { …
for(i in 2..10 step 2) { …
for(i in 9 downTo 1 step 2) { …
for(1 in 1 until 10) { …
for(i in 'a'..'z') { …
for(i in 'A' until 'z' step 2) { …

・多重戻り値
関数の戻り値を複数返せる
(厳密にはKotlinは多重戻り値には対応しないが分解宣言によって複数の戻り値を返せる)

・分解宣言

0 件のコメント:

その他の記事