分享

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

 爱因思念l5j0t8 2017-05-22

相关阅读:

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

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

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

来源http:///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'


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多