Day1 Kotlin 上手

9 阅读2分钟

Kotlin的基础语法

变量的定义

var age: Int = 18
val name: String =  "Amy"
var age = 18
val name = "Amy"

可以看出来几乎和swift 一模一样,var 变量 val 对应于let,可以自己推导出变量的类型

Kotlin可空类型 vs Swift Optional

Kotlin写法

var name: String = "Amy"   // 非空,必须有值
var name2: String? = "Amy" // 可空,相当于Optional<String>
name = name2    // ❌ 编译报错,不能把String?赋给String
name = name2!!  // ✅ 强制解包,可能crash(相当于Swift的!)
name2 = name    // ✅ String可以赋给String?
//空合并运算符
val result = name2 ?: "default"
//可选绑定
name2?.let { x -> 
    println(x)//只有name2 非空的时候执行
}
//guard let (提前返回)
fun printName(name2:String?){
val x = name2 ?: return // 为空直接return,相当于guard let
println(x) // 这里的x 是非空的String

Swift的写法

var name: String = "Zhang Tao"
var name2: String? = "Zhang Tao"
name = name2    // ❌ 编译报错
name = name2!   // ✅ 强制解包
name2 = name    // ✅
// 可选绑定
if let x = name2 {
    print(x)
}

// guard let
func printName(_ name2: String?) {
    guard let x = name2 else { return }
    print(x)
}

Swift的Optional是枚举类型包装,Kotlin的可空类型是编译器层面的类型系统检查,本质实现不同,但开发体验几乎一致

函数的定义

fun echo(name: String): String? = name

Swift用func声明函数、->表示返回值,Kotlin用fun 声明、 :表示返回值,
字符串插值Swift 是\(name),Kotlin 是 $name

Kotlin 一键单例

Kotlin用object关键字,语言层面直接支持单例,省去样板代码

object UserManager{
    fun logout(){}
}
UserManager.logout()

swift 需要手动实现单例模板:

class UserManager {
    static let shared = UserManager()
    private init(){}
}
UserManager.shared.logout()

类类型表示

Kotlin 用 UserManager::class
Java 用 UserManager::class.java
Swift 用 UserManager.self 

static/class func 去哪了?

Swift用static或class func 定义类方法,Kotlin没有这两个关键字,用companion object 替代:

Kotlin
class User{
    companion object {
        //单表达式函数,函数体只有一行时可以省略大括号和return(Swift单表达式只能省略return)
        fun create(): User = User()
        fun desc(): String = "User"
    }
    var name = "Alfred"
}
User.create()
User.desc()
User().name

Swift
class User {
    static func create() -> User { User() }
    class func desc() -> String { "User" }
    var name = "Amy"
}
User.create()
User.desc() 
User().name