Cafdev đã tổng hợp và so sánh mọi thứ trong code của Swift vs Kotlin. Và từ đó thấy sự tường đồng đến bất ngờ của 2 ngôn ngữ này mà ae developer nên biết trước khi muốn học thêm iOS hay Android.

Hello World

SwiftKotlin
print(“Hello, world!”)println(“Hello, world!”)

Variables And Constants

SwiftKotlin
var myVariable = 42
myVariable = 50
let myConstant = 42
var myVariable = 42
myVariable = 50
val myConstant = 42

Explicit Types

SwiftKotlin
let explicitDouble: Double = 70val explicitDouble: Double = 70.0

Type Coercion

SwiftKotlin
let label = “The width is “
let width = 94
let widthLabel = label + String(width)
val label = “The width is “
val width = 94
val widthLabel = label + width

String Interpolation

SwiftKotlin
let apples = 3
let oranges = 5
let fruitSummary = “I have (apples + oranges) ” + “pieces of fruit.”
val apples = 3
val oranges = 5
val fruitSummary = “I have ${apples + oranges} ” + “pieces of fruit.”

Range Operator

Swift

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

Kotlin

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 Range Operator

Swift

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

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

Arrays

SwiftKotlin
var shoppingList = [“catfish”, “water”,
“tulips”, “blue paint”]
shoppingList[1] = “bottle of water”
val shoppingList = arrayOf(“catfish”, “water”,
“tulips”, “blue paint”)
shoppingList[1] = “bottle of water”

Maps Swift

SwiftKotlin
var occupations = [
“Malcolm”: “Captain”,
“Kaylee”: “Mechanic”,
]
occupations[“Jayne”] = “Public Relations”
val occupations = mutableMapOf(
“Malcolm” to “Captain”,
“Kaylee” to “Mechanic”
)
occupations[“Jayne”] = “Public Relations”

Empty Collections

SwiftKotlin
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
val emptyArray = arrayOf()
val emptyMap = mapOf()

FUNCTIONS

Swift




func greet(_ name: String,_ day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Cafedev.vn", "Tuesday")

Kotlin

fun greet(name: String, day: String): String {
    return "Hello $name, today is $day."
}
greet("Cafedev.vn", "Tuesday")

Tuple Return

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)

Variable Number Of Arguments

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()

Function Type

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

Map

SwiftKotlin
let numbers = [20, 19, 7, 12]
numbers.map { 3 * $0 }
val numbers = listOf(20, 19, 7, 12)
numbers.map { 3 * it }

Sort

SwiftKotlin
var mutableArray = [1, 5, 3, 12, 2]
mutableArray.sort()
listOf(1, 5, 3, 12, 2).sorted()

Named Arguments

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)

CLASSES

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()

Subclass

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

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()

Checking Type

Swift

var movieCount = 0
var songCount = 0

for item in library {
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}

Kotlin

var movieCount = 0
var songCount = 0

for (item in library) {
    if (item is Movie) {
        ++movieCount
    } else if (item is Song) {
        ++songCount
    }
}

Pattern Matching

Swift

let nb = 42
switch nb {
    case 0...7, 8, 9: print("single digit")
    case 10: print("double digits")
    case 11...99: print("double digits")
    case 100...999: print("triple digits")
    default: print("four or more digits")
}

Kotlin




val nb = 42
when (nb) {
    in 0..7, 8, 9 -> println("single digit")
    10 -> println("double digits")
    in 11..99 -> println("double digits")
    in 100..999 -> println("triple digits")
    else -> println("four or more digits")
}

Downcasting

Swift

for current in someObjects {
    if let movie = current as? Movie {
        print("Movie: '\(movie.name)', " +
            "dir. \(movie.director)")
    }
}

Kotlin

for (current in someObjects) {
    if (current is Movie) {
        println("Movie: '${current.name}', " +
	    "dir. ${current.director}")
    }
}

Protocol

Swift

protocol 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 lại không xa ae developer iOS vs Android có thể nói chuyện với nhau một cách dễ dàng hơn trong code và dev app. Vì có quá nhiều sự tương đồng.