常用的幾個複合符號
《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