专栏名称: 开发者全社区
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
郭霖  ·  Android振动分析:从App层到HAL层 ·  2 天前  
鸿洋  ·  系统Apk、普通Apk、core ... ·  2 天前  
鸿洋  ·  一波深入的Android 性能优化 ·  3 天前  
郭霖  ·  这可能是Android软键盘监听的最佳方案 ·  5 天前  
郭霖  ·  activityGuard:Android ... ·  4 天前  
51好读  ›  专栏  ›  开发者全社区

Swift 就像 Kotlin?Swift 与 Kotlin 的对比让你更深入理解Kotlin

开发者全社区  · 公众号  · android  · 2017-05-21 10:22

正文

相关阅读:

使用Kotlin优雅的开发Android应用,附demo

一文让你全面深入了解Kotlin,附优秀的开源Kotlin的Android项目和视频

Kotlin学习资料大全,附学习视频首发

来源http://nilhcem.com/swift-is-like-kotlin/

翻译:开源中国


一位国外的程序员认为 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"


更多学习资料点击下面的“阅读原文”获取