无论你是想学习 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
编译:全站工程师