So sánh Swift và Kotlin
Bài đăng này đã không được cập nhật trong 5 năm
Mở đầu
Thị trường mobile hiện đang chia thành 2 thái cực chính là iOS và Android với sự chống lưng của 2 ông lớn là Apple và Google. Để phát triển ứng dụng cho 2 hệ điều hành đó thì lập trình viên cần lựa chọn những ngôn ngữ lập trình phù hợp:
- Native iOS: Swift, Object - C
- Native Android: Java, Kotlin
- Cross-platform: Javascript cho React Native, C# cho Xamarin, Dart cho Flutter, etc...
Mặc dù các cross-platform framework đang phát triển mạnh mẽ nhưng nó vẫn không thể thay thế hoàn toàn các native framework. Trong một vài trường hợp chúng ta buộc phải viết các module riêng biệt cho iOS và Android thì việc biết về các ngôn ngữ lập trình cho từng hệ điều hành là cần thiết. Với mỗi module thì yêu cầu viết bằng một ngôn ngữ khác nhau mà bạn chỉ biết một thì phải làm sao?
Ở bài viết này, mình sẽ giúp bạn chỉ ra những cú pháp giúp bạn đỡ bỡ ngỡ khi tiếp xúc với 2 ngôn ngữ lập trình nổi bật để tạo ứng dụng cho từng hệ điều hành. Đó là Swift (iOS) và Kotlin (Android)
Những cú pháp cơ bản
Hello World
Swift
print("Hello, world!")
Kotlin
println("Hello, world!")
Variables and Constants
Swift
var myVariable = 42
myVariable = 50
let explicitDouble: Double = 42
Kotlin
var myVariable = 42
myVariable = 50
val explicitDouble: Double = 70.0
Type Coercion
Swift
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
Kotlin
val label = "The width is "
val width = 94
val widthLabel = label + width
String Interpolation
Swift
let apples = 3
let oranges = 5
let fruitSummary = "I have \(apples + oranges) " +
"pieces of fruit."
Kotlin
val apples = 3
val oranges = 5
val fruitSummary = "I have ${apples + oranges} " +
"pieces of fruit."
Range Operator
Swift
// Exclusive
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
// Inclusive
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
Kotlin
// Exclusive
val names = arrayOf("Anna", "Alex", "Brian", "Jack")
val count = names.count()
for (i in 0..count - 1) {
println("Person ${i + 1} is called ${names[i]}")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
// Inclusive
for (index in 1..5) {
println("$index times 5 is ${index * 5}")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
Collections
Array
Swift
var shoppingList = ["catfish", "water",
"tulips", "blue paint"]
shoppingList[1] = "bottle of water"
Kotlin
val shoppingList = arrayOf("catfish", "water",
"tulips", "blue paint")
shoppingList[1] = "bottle of water"
Maps
Swift
// Tên chính thức trong Swift là Dictionary
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
Kotlin
val occupations = mutableMapOf(
"Malcolm" to "Captain",
"Kaylee" to "Mechanic"
)
occupations["Jayne"] = "Public Relations"
Empty Collections
Swift
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
Kotlin
val emptyArray = arrayOf<String>()
val emptyMap = mapOf<String, Float>()
Functions
Khai báo
Swift
func greet(_ name: String,_ day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
Kotlin
fun greet(name: String, day: String): String {
return "Hello $name, today is $day."
}
greet("Bob", "Tuesday")
Trả về nhiều giá trị (Tuple)
Swift
func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79)
}
Kotlin
data class GasPrices(val a: Double, val b: Double,
val c: Double)
fun getGasPrices() = GasPrices(3.59, 3.69, 3.79)
Khai báo hàm với số lượng tham số không xác định
Swift
func sumOf(_ numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf(42, 597, 12)
Kotlin
fun sumOf(vararg numbers: Int): Int {
var sum = 0
for (number in numbers) {
sum += number
}
return sum
}
sumOf(42, 597, 12)
// sumOf() can also be written in a shorter way:
fun sumOf(vararg numbers: Int) = numbers.sum()
Hàm trả về một hàm
Swift
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
let increment = makeIncrementer()
increment(7)
Kotlin
fun makeIncrementer(): (Int) -> Int {
val addOne = fun(number: Int): Int {
return 1 + number
}
return addOne
}
val increment = makeIncrementer()
increment(7)
// makeIncrementer can also be written in a shorter way:
fun makeIncrementer() = fun(number: Int) = 1 + number
Định nghĩa tên tham số
Swift
func area(width: Int, height: Int) -> Int {
return width * height
}
area(width: 2, height: 3)
Kotlin
fun area(width: Int, height: Int) = width * height
area(width = 2, height = 3)
// This is also possible with named arguments
area(2, height = 2)
area(height = 3, width = 2)
Các hàm của mảng
Swift
let numbers = [20, 19, 7, 12]
numbers.map { 3 * $0 }
numbers.sort()
Kotlin
val numbers = listOf(20, 19, 7, 12)
numbers.map { 3 * it }
numbers.sorted()
Class
Khai báo
Swift
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
Kotlin
class Shape {
var numberOfSides = 0
fun simpleDescription() =
"A shape with $numberOfSides sides."
}
Sử dụng
Swift
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
Kotlin
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
Kế thừa
Swift
class NamedShape {
var numberOfSides: Int = 0
let name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
self.numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length " +
sideLength + "."
}
}
let test = Square(sideLength: 5.2, name: "square")
test.area()
test.simpleDescription()
Kotlin
// Các class trong Kotlin mặc định là final
open class NamedShape(val name: String) {
var numberOfSides = 0
open fun simpleDescription() =
"A shape with $numberOfSides sides."
}
class Square(var sideLength: BigDecimal, name: String) :
NamedShape(name) {
init {
numberOfSides = 4
}
fun area() = sideLength.pow(2)
override fun simpleDescription() =
"A square with sides of length $sideLength."
}
val test = Square(BigDecimal("5.2"), "square")
test.area()
test.simpleDescription()
Protocol
Swift
vprotocol Nameable {
func name() -> String
}
func f<T: Nameable>(x: T) {
print("Name is " + x.name())
}
Kotlin
interface Nameable {
fun name(): String
}
fun f<T: Nameable>(x: T) {
println("Name is " + x.name())
}
Extensions
Swift
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// prints "One inch is 0.0254 meters"
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
// prints "Three feet is 0.914399970739201 meters"
Kotlin
val Double.km: Double get() = this * 1000
val Double.m: Double get() = this
val Double.cm: Double get() = this / 100
val Double.mm: Double get() = this / 1000
val Double.ft: Double get() = this / 3.28084
val oneInch = 25.4.mm
println("One inch is $oneInch meters")
// prints "One inch is 0.0254 meters"
val threeFeet = 3.0.ft
println("Three feet is $threeFeet meters")
// prints "Three feet is 0.914399970739201 meters"
Tổng kết
Trong bài viết này, mình đã giới thiệu những điểm tương đồng giữa Swift và Kotlin, qua đó giúp các bạn có thể tự tin trong quá trình viết các ứng dụng trên cả 2 nền tảng iOS và Android. Happy coding!
Nguồn tham khảo:
All rights reserved