フリープログラマー日記

iOS,アンドロイド開発を気ままにしながら生きてるおじさんのブログです。

第43回 KotlinでコンパイラWarningが出てくる

Kotlin でお遊びしてて気づいた。
いつも Warningが表示されています。
何も手を加えていない最初のプログラムをコンパイルした時の結果がこれ。


f:id:momonga117:20180620021110p:plain

勝手に作っておいて、どうしてコンパイラエラーなんか出すの!
と、言っててもしょうがないので、原因を探ると・・・

f:id:momonga117:20180620021458p:plain

implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" のところに何やら横線が引かれているじゃありませんか!

さらに。
f:id:momonga117:20180620021758p:plain

ライブラリファイルなんでしょうか?これ。

"org.jetbrains.kotlin:kotlin-stdlib-jre7のところを

org.jetbrains.kotlin:kotlin-stdlib-jdk7に変えろということらしいです。

で、取り替えて見たら、コンパイラエラーは消えました。

でもさ〜。親切にヒントくれるくらいなら、どうして最初からjdkの方にしてくれないのって思ってしまった。


というところで、
Kotlin始めて分かってきたことを2、3書くと。

1.クラスの外側に関数を置くことができる!
(Kotlinできる、Javaできない、Swiftできる)

これは、関数もクラスと同等のオブジェクトであるということらしい。しかし、Swift もできたとは驚き。
これの使用法については、考え中。

2.pair や triple が使える!
例えば、判定結果として、(x、y)の2つの数字を返すような関数を作る時、swiftで

       func Jadge(x: CGFloat, y: CGFloat) -> (i,j) {
         let i = x / 40
         let j = y / 40
         return (i,j)
      }

みたいなことをしていました。
swiftではタプルという仕組みらしいですが、Javaにはなく、最近は使っていませんでした。
Kotlinで使えるなら、また使って見たいなと思っているところです。

swift と Kotlin が似てるようで、微妙に違うのがかえって混乱を起こすことがあります。nil と null は似てるが、swiftの場合、必ず、?か!をつけますよね?
ところが、Kotlinは宣言時に?をつけるところは同じなのに、何もつけないで使ってたり、!!をつけてみたり。

迷っているのは、タッチイベントの時、event: MotionEvent? で渡ってくるので、このeventの扱いが悩みで・・・

    override fun onTouchEvent(event: MotionEvent?): Boolean {

            if (event != null) {
                val touch = event.action      // タッチの種類を格納する
                val x = event.x
                val y = event.y

                when (touch) {
                    MotionEvent.ACTION_UP -> {
                        performClick()
                        val width = width.toFloat()
                        val height = height.toFloat()


                        // 4種の判定
                        // 4コマンド(エントリー・設定・ラップ計測・記録)
                        val y1 = height / 2 - width * 0.4f
                        val y2 = height / 2 - width * 0.3f
                        val y3 = height / 2 + width * 0.3f
                        val y4 = height / 2 + width * 0.4f
                        val x1 = width * 0.05f
                        val x2 = width * 0.3f
                        val x3 = width * 0.7f
                        val x4 = width * 0.95f
                        // 判定
                        if (y > y1 && y < y2) {
                            if (x > x1 && x < x2) {
                                // エントリーメニューの呼び出し
                                entryViewRunnable!!.run()
                            } else if (x > x3 && x < x4) {
                                // 設定メニューの呼び出し
                                settingViewRunnable!!.run()
                }
            }
        return true
    }

このeventは null ではないはずです。多分・・・
でも、教科書的に、null の時は処理しないようにしました。
そしたら、event変数のところにメッセージが???

Smart cast to android.view.MotionEvent ← 何これ?って感じです。
MotionEventについてスマートキャストしてるよ。で、いい?
警告ではなさそうなので、このメッセージが出てもいいのかな。

まだまだ、Kotlin 見えてこないです。Kotlin霧中。(ダジャレ〜、わかるかな?)

ただ、シングルトンに関しては結構簡単に実現できそうなので、楽かも。

swift <-> Kotlin の移植性高いと嬉しいが、どうなんだろね。