Swift VS Kotlin

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift VS Kotlin相关的知识,希望对你有一定的参考价值。

参考技术A Swift和Kotlin作为更加"现代化"的语言,毫无疑问提升了开发原生app的效率,二者旨在与Objective-C和Java互操作,方便"旧"应用的开发进行更新,如果你要从零开始编写一个全新的应用,不要犹豫,选择使用它们,尽情享受它们带来的乐趣。这两个语言有着许多相似之处,让我们来"欣赏"一下吧:

Kotlin有一个称为数据类的东西,该类在编译时将获得诸如hashCode(),toString()和copy()等方法。可以这样定义:

Swift没有数据类或任何等效类。

Swift具有元组功能,并且可以为元组设定类型别名;
Kotlin具有Pair和Triple工具类,用于呈现2元和3元组对象,并且可以通过data class模拟自定义元组。

Swift Struct和Class之间的区别在于,结构体是值类型,而类是引用类型。可将元组视为隐式定义的Struct:

Kotlin没有Struct类型。但是,我们可以通过copy函数创建一个新引用:

我们可以使用Kotlin数据类和Swift结构体来保存数据。即使一个是引用类型,另一个是值类型。

Swift和Kotlin都有枚举。但是声明和匹配方式有很大的区别:

Kotlint通过密封类可以实现枚举。Kotlin的Sealed Class和Swift的Enum之间的唯一区别是,密封类是引用类型,而Swift的Enum是值类型:

Swift还具有隐式解包功能,它定义了一个可选内容,但告诉编译器可以展开该内容,因为后面它将会被值。Kotlin也可以通过lateinit关键字执行相同的操作。需要注意的是,作为开发人员,应尽可能避免使用隐式解包方式。

协议和接口有相同的功能,只是使用了不同的术语。它们定义了一个类在实现接口时必须遵循的一组函数/变量。Kotlin允许在接口的定义中使用泛型,而Swift则可以通过定义关联类型associatedtype来实现。

高阶函数本质上是接受闭包或函数作为参数并返回新值或另一个函数的函数。使用高阶函数,我们可以对值(例如数组)进行转换,过滤和迭代。

参考:

Swift 就像 Kotlin?看看 Swift 与 Kotlin 的简单对比

英文:nilhcem.com

编译:开源中国

如有好文章投稿,请点击 → 这里了解详情


一位国外的程序员认为 Swift 的语法与 Kotlin 相似,并整理了一些 Swift 和 Kotlin 的对比,下面是一些例子,大家不妨也看看。


BASICS


Hello World


Swift


print("Hello, world!")


Kotlin


println("Hello, world!") 


变量和常量


Swift


var myVariable = 42

myVariable = 50

let myConstant = 42


Kotlin


var myVariable = 42

myVariable = 50

val myConstant = 42


显式类型


Swift


let explicitDouble: Double = 70


Kotlin


val explicitDouble: Double = 70.0


强制类型转换


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


字符串插值


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."


范围操作符


Swift


let names = ["Anna", "Alex", "Brian", "Jack"]

let count = names.count

for i in 0..


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


BASICS


数组


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"


映射


Swift


var occupations = [

    "Malcolm": "Captain",

    "Kaylee": "Mechanic",

]

occupations["Jayne"] = "Public Relations"


Kotlin


val occupations = mutableMapOf(

    "Malcolm" to "Captain",

    "Kaylee" to "Mechanic"

)

occupations["Jayne"] = "Public Relations"


空集合


Swift


let emptyArray = [String]()

let emptyDictionary = [String: Float]()


Kotlin


val emptyArray = arrayOf()

val emptyMap = mapOf()


FUNCTIONS


函数


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


元组返回


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


函数类型


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


映射


Swift


let numbers = [20, 19, 7, 12]

numbers.map { 3 * $0 }


Kotlin


val numbers = listOf(20, 19, 7, 12)

numbers.map { 3 * it }


排序


Swift


var mutableArray = [1, 5, 3, 12, 2]

mutableArray.sort()


Kotlin


listOf(1, 5, 3, 12, 2).sorted()


命名参数


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."

}


用法


Swift


var shape = Shape()

shape.numberOfSides = 7

var shapeDescription = shape.simpleDescription()


Kotlin


var shape = Shape()

shape.numberOfSides = 7

var shapeDescription = shape.simpleDescription()


子类


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


类型检查


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

    }

}


模式匹配


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

}


类型向下转换


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}")

    }

}


协议


Swift


protocol Nameable {

    func name() -> String

}

 

func f(x: T) {

    print("Name is " + x.name())

}


Kotlin


interface Nameable {

    fun name(): String

}

 

fun f(x: T) {

    println("Name is " + x.name())

}


扩展


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"


看完本文有收获?请分享给更多人

关注「 iOS大全 」,提升iOS技能

以上是关于Swift VS Kotlin的主要内容,如果未能解决你的问题,请参考以下文章

Kotlinkotlin中的小技巧

Kotlinkotlin中的空指针检查

KotlinKotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )

KotlinKotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )

KotlinKotlin 常用表达式 ( range 范围表达式 | when 条件表达式 | 字符串模板 )

KotlinKotlin 变量与常量 ( 变量声明 | 只读变量 | 类型推断 | 编译时常量 | Kotlin 字节码查看面板 | Kotlin 引用数据类型 )