筆記 Kotlin 複合符號( ?. ?: !! ) null判斷 和swift的比較

常用的幾個複合符號
《Kotlin 實戰》小人系列,的這本書裏 畫的圖很清晰了,我又重畫了一遍。

2.1、 ?.安全調用符
!這裏寫圖片描述


if (foo != null){
    return foo.bar()
}else{

    return null
}

2.2、 ?:


2.3、 as?


2.4、 !!


2.5、 ?

 

Swift 和 Kotlin的比較

實時命令環境,swift 有Playground ,Kotlin 用 REPL 

 

constant, variable

  Swift Kotlin
constant let val
variable var var

if let

Swift
var str: String? = "Hello, Swift"
print(str) // "Optional("Hello, Swift")"
print(str!) // "Hello, Swift"
if let str = str {
    print(str) // "Hello, Swift"
} else {
    print("str is nil")
}




Kotlin
var str: String? = "Hello, Kotlin"
print(str) // "Hello, Kotlin"
print(str!!) // "Hello, Kotlin"
str?.let {
    print(it) // "Hello, Kotlin"
} ?: run {
    print("str1 is null")
}

三元表示式・Tertiary Operator

Swift

let result = a > b ? "foo" : "bar"

Kotlin沒有三元表示式

val result = if(a > b) "foo" else "bar"

Forced Unwrapping  !!

Swift
var str: String? = nil
print(str) // nil
print(str!) // "fatal error: unexpectedly found nil while unwrapping an Optional value"



Kotlin
var str: String? = null
print(str) // "null"
print(str!!) // "kotlin.KotlinNullPointerException"

Implicitly Unwrapped Optional

Swift
class MyClass {
    var foo: String!
    var bar: String!
}
val myClass = MyClass()
myClass.foo = "foo"
print(myClass.foo)
print(myClass.bar) // "fatal error: unexpectedly found nil while unwrapping an Optional value"




Kotlin
class MyClass {
    lateinit var foo: String
    lateinit var bar: String
}
val myClass = MyClass()
myClass.foo = "foo"
print(myClass.foo)
print(myClass.bar) // kotlin.UninitializedPropertyAccessException: lateinit property bar has not been initialized

 

guard

Swift
func foo(str: String?) {
    guard let str = str else {
        print("str is null")
        return
    }
    print(str.characters.count) // "4"
}

foo(str: "hoge")



Kotlin
fun foo1(str: String?) {
    if (str == null) {
        print("str is null")
        return
    }
    print(str.length) // "4"。 unwrap しなくて良い。賢い
}
foo1("hoge")

// もしくは、こんな書き方
fun foo2(str: String?) {
    var str = str ?: return
    print(str.length) // "4"
}
foo2("hoge")


Switch

//Swift
let x = 1
switch x {
    case 1: print("x == 1")
    case 2: print("x == 2")
    default: print("x is neither 1 nor 2")
}


//Kotlin
val x = 1
when (x) {
  1 -> print("x == 1")
  2 -> print("x == 2")
  else -> print("x is neither 1 nor 2")
}

構造體・Struct

Swift
struct Resolution { var width: Int, height: Int }
let r = Resolution(width: 1, height: 2)
print(r) // "Resolution(width: 1, height: 2)"

Kotlin
data class Resolution(val width: Int, val height: Int){}
val r = Resolution(1, 2)
print(r) // "Resolution(width: 1, height: 2)"

拡張・Extension

Swift
extension Double {
    var km: Double { return self * 1_000.0 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
}
print(25.4.km)

Kotlin
val Double.km: Double get() = this * 1000.0
val Double.m: Double get() = this
val Double.cm: Double get() = this / 100.0
print(25.4.km)

方法的擴展

Swift
extension Int {
    func repetitions(task: () -> ()) {
        for _ in 0..<self {
            task()
        }
    }
}

3.repetitions {
    print("Hello, Swift!")
}
// "Hello, Swift!"
// "Hello, Swift!"
// "Hello, Swift!"

fun Int.repetitions(task: () -> Unit) {
    for (i in 0 until this) {
        task()
    }
}

3.repetitions {
    println("Hello, Kotlin!")
}
// "Hello, Kotlin!"
// "Hello, Kotlin!"
// "Hello, Kotlin!"

靜態・Static

Swift
class MyClass {
    static func foo() -> String {
        return "Hello, Swift!"
    }
    static let bar = "Hello, Swift!"
}
print(MyClass.foo()) // "Hello, Swift!"
print(MyClass.bar) // "Hello, Swift!"



Kotlin
class MyClass {
    companion object {
        fun foo() {
            print("Hello, Kotlin!")
        }
        val bar = "Hello, Kotlin!"
    }
}
print(MyClass.foo()) // "Hello, Kotlin!"
print(MyClass.bar) // "Hello, Kotlin!"

tuple

Swift
let foo = ("left", "right")
print(foo.0) // "left"
print(foo.1) // "right"


Kotlin
val foo = Pair("left", "right")
print(foo.first) // "left"
print(foo.second) // "right"

 

懶加載

Swift
class MyClass {
    lazy var foo = "foo"
}


Kotlin
class MyClass {
    val foo: String by lazy { "foo" }
}

 

參考

qiita.com/RyoAbe/items/2b0ded05c5c5a585a879

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章