写给 Swift 开发者的 Kotlin 教程

无论你是想学习 Android 开发知识的 iOS 程序员,还是你是仍在使用 Java 的安卓程序员,又或者你是已在用 Kotlin 的 Android 程序员却想多了解一点 Swift,这篇文章都适合你。
这是两种流行的现代移动开发语言的对比,不过我只谈论语言,而不会去涉及实现的应用开发,所以你看到的这些内容也适用于移动开发之外的领域。

两者的相似之处

首先,两种语言拥有很多相同之外。它们都是强类型且都支持类型推导,所以当编译器可以从赋值推导时你无须指定变量类型:

var text: String = "lorem ipsum"    // 这是一个 string 型变量
var otherText = "sit dolor amet"    // 这是也是一个 string 型

它们都支持 immutable不变量,这对于线程安全的编码来说是个很强大的概念:

let numberFour = 4  // Swift 里的 Immutable 整型
var numberFive = 5  // Kotlin 里的 Immutable 整型

它们也都通过可选类型支持空引用安全(null safety):

// 当 someObjectOrNull 不为空时 someMethod 被调用
someObjectOrNull?.someMethod()

两者都支持尾闭包。

Swift:

// 定义函数
func doSomething(andCall callback: () -> Void) { … }
// 调用函数
doSomething {
    // 回调函数
    …
}

Kotlin 也有同样的特性:

// 定义函数
fun doSomething(callback: () -> Unit) { … }
// 调用函数
doSomething {
    // 回调函数
    …
}

所有这些特性都允许用这两种语言写出更简洁和可阅读的代码。
现在,来看看一些不同之处。

if let 与 ?.let

Swift 里一个众所周知且很常用的模式是 if let 模式,当你处理可选类型值时,通过它可以仅当值被设置过的情况下执行逻辑:

let someOptional: String? = …
if let text = someOptional {
    // 此处 text 是一个非可选类型的 string
    …
}

在 Kotlin 里你可以使用定义于所有类型的标准函数 let 做同样的事情:

val someOptional: String? = …
someOptional?.let { text ->
    // 此处 text 是一个非可选类型的 string
    …
}

不过 Kotlin 里没有像 Swift 的 guard let 这种用法。作为回报,Kotlin 的标准函数(如 let, apply, with, run , also, …)提供了远超 if let 功能的用法,但这些用法已经超出文本的讨论范围了。

字面量与辅助函数

和许多语言一样,Swift 知道类似数组字典这类复杂类型的字面量注解:

// [String] 数组
let list = ["lorem", "ipsum"]
// [Int: String] 字典
let dict = [10: "lorem", 20: "ipsum"]

不幸的是,Kotlin 不支持这种字面量注解——至少目前没有。替代的方案,是退一步使用辅助方法:

// Array 类型的数据
val list = arrayOf("lorem", "ipsum")
// Map 类型的 Map
val map = mapOf(10 to "lorem", 20 to "ipsum")

针对不同的情况存在几个辅助函数:arrayOf, mutableArrayOf, listOf, mutableListOf, setOf, mutableSetOf, mapOf, mutableMapOf

函数命名及命名参数

Swift 似乎从 Objective-C 继承了函数声明方式。可能是苹果希望他们现有的 API 能在两种语言里以相似的方式工作。无论如何,我个人喜欢 Swift 的函数声明方式,因为它可以带来更可阅读的代码:

// 定义函数
func processText(_ text: String, withOptions options: [Int]) { … }
// 调用函数
processText("lorem ipsum", withOptions: [1, 2])

相较之下,Kotlin 使用更经典的 C 风格方案:

// 定义函数
fun processText(text: String, options: Set) { … }
// 调用函数
processText("lorem ipsum", setOf(1, 2))

第二种谈何很接近 Swift 的描述方式。

it 关键字

Kotlin 里的 it 关键字和 Swift 高阶函数中的 $0 类似。让我们以一个简单的 map 调用作为示例:

[1, 2, 3].map { $0 * }  // 结果:[2, 4, 6]

Kotlin 中相同的用法:

listOf(1, 2, 3).map { it * 2 }  // 结果:listOf(2, 4, 6)

除此之外,许多 Kotlin 标准函数都可以使用 it。让我们来回顾一下前面的 if let 示例:

val someOptional: String? = …
someOptional?.let { text ->
    // 这里的 text 是非可选类型
    …
}

如果在 let 块中没有命名参数 text,则可以通过 it 访问 someOptional 的未装箱内容:

val someOptional: String? = …
someOptional?.let {
    // 这里,it 是非可选类型的 string
    …
}

小结

Swift 和 Kotlin 确实有很多相似的概念,但他们在很多情况下仍然采取了不同的方案。希望我能帮助你弥补这两种非凡美妙语言之间的一些鸿沟。


原文:https://medium.com/@raphaelstaebler/kotlin-for-swift-developers-40e846fb7813
作者:Raphael Stäbler
编译:全站工程师

你可能感兴趣的:(写给 Swift 开发者的 Kotlin 教程)