Slide 1

Slide 1 text

Stanfy MadCode #10 From Java to Kotlin. From Objective-C to Swift. by Oleksandr Tereshchuk and Alexander Voronov

Slide 2

Slide 2 text

Into New Language Stanfy MadCode #10

Slide 3

Slide 3 text

Development Environment Stanfy MadCode #10

Slide 4

Slide 4 text

[ ] IntelliJ IDEA 15 bundles the Kotlin Stanfy MadCode #10

Slide 5

Slide 5 text

[ ] Command line tools - http://try.kotlinlang.org/ import java.io.File
 val folders = File(args[0]).listFiles { file -> file.isDirectory() }
 folders?.forEach { folder -> println(folder) } $ kotlinc -script list_folders.kts Stanfy MadCode #10

Slide 6

Slide 6 text

[ ] Refactoring Stanfy MadCode #10

Slide 7

Slide 7 text

[ ] Playground & REPL https://developer.apple.com/swift/blog/?id=24 Stanfy MadCode #10

Slide 8

Slide 8 text

[ ] Backward Compatibility Stanfy MadCode #10

Slide 9

Slide 9 text

[ ] Bridging & Interoperability Nullability Lightweight Generics Kindof Stanfy MadCode #10

Slide 10

Slide 10 text

Project Design Stanfy MadCode #10

Slide 11

Slide 11 text

[ ] Configure Android project Just follow simple guide: https://kotlinlang.org/docs/tutorials/kotlin-android.html Stanfy MadCode #10

Slide 12

Slide 12 text

[ ] Project Design Headers Modules Multiple Items per File Stanfy MadCode #10

Slide 13

Slide 13 text

Language Vector Stanfy MadCode #10

Slide 14

Slide 14 text

[ ] Concise Create a POJO with getters, setters, equals(), hashCode(), toString() and copy() in a single line: data class Customer(val name: String, val email: String, val company: String) Want a singleton? Create an object: object ThisIsASingleton {
 val companyName: String = "JetBrains"
 } Stanfy MadCode #10

Slide 15

Slide 15 text

[ ] Safe val x: String? = "Hi"
 x.length // Does not compile.
 
 val y: String = null // Does not compile.
 if (x != null) {
 x.length // Compiles! Not idiomatic just to get length!
 }
 
 // Same as above (IntelliJ auto-suggested the change).
 x?.length
 
 // Elvis operator.
 val len = x?.length ?: -1
 val len = x!!.length // Will throw if null. Rarely used. Stanfy MadCode #10

Slide 16

Slide 16 text

[ ] Versatile & Interoperable 100% compatible with all JVM frameworks 100% Java Interoperability JavaScript compiler to target Node.js environment Very small runtime and stdlib for Android development ~ 1MB Stanfy MadCode #10

Slide 17

Slide 17 text

[ ] Protocol-Oriented https://developer.apple.com/videos/play/wwdc2015-408 “Swift Is a Protocol-Oriented Programming Language” – Dave Abrahams Stanfy MadCode #10

Slide 18

Slide 18 text

[ ] Values instead of References VS Stanfy MadCode #10

Slide 19

Slide 19 text

[ ] Safety Stanfy MadCode #10

Slide 20

Slide 20 text

Language Features Stanfy MadCode #10

Slide 21

Slide 21 text

[ ] Lambdas val longest = max(strings, { a, b -> a.length() < b.length() })
 
 val lengthFive = strings.filter { it.length == 5 }.sortBy { it }.map { it.toUpperCase() } Stanfy MadCode #10

Slide 22

Slide 22 text

[ ] Extension Methods fun MutableList.swap(index1: Int, index2: Int) {
 val tmp = this[index1] // 'this' corresponds to the list
 this[index1] = this[index2]
 this[index2] = tmp
 }
 
 val l = mutableListOf(1, 2, 3)
 l.swap(0, 2) Stanfy MadCode #10

Slide 23

Slide 23 text

[ ] Sealed classes sealed class Expr {
 class Const(val number: Double) : Expr()
 class Sum(val e1: Expr, val e2: Expr) : Expr()
 object NotANumber : Expr()
 } fun eval(expr: Expr): Double = when(expr) {
 is Const -> expr.number
 is Sum -> eval(expr.e1) + eval(expr.e2)
 NotANumber -> Double.NaN
 // the `else` clause is not required because we've covered all the cases
 } Stanfy MadCode #10

Slide 24

Slide 24 text

[ ] Data classes data class User(val name: String = "", val age: Int = 0) /*
 * fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
 */ val adam = User("Adam", 35) val jane = adam.copy(name = "Jane") 
 val (name, age) = jane
 println("$name, $age years of age") // prints "Jane, 35 years of age" Stanfy MadCode #10

Slide 25

Slide 25 text

[ ] Language Features First Class Functions Partial Application Generics Type Inference Enums Operators Standard Library Stanfy MadCode #10

Slide 26

Slide 26 text

Publishing Stanfy MadCode #10

Slide 27

Slide 27 text

[ ] Publishing Stanfy MadCode #10

Slide 28

Slide 28 text

[ ] AppStore Publishing Built with xcodebuild Exported from Xcode Organizer 10038 4 21680 Stanfy MadCode #10

Slide 29

Slide 29 text

Language Evolution Stanfy MadCode #10

Slide 30

Slide 30 text

[ ] Still in beta... Sponsored and developed by JetBrains - https://kotlinlang.org/ Already have a huge community - Slack channel Not as known as Scala or Groovy yet Still in beta - syntax changes, missing features, hidden bugs Using Project Kotlin for Android by Jake Wharton Stanfy MadCode #10

Slide 31

Slide 31 text

[ ] Stable Swift Evolution Stanfy MadCode #10

Slide 32

Slide 32 text

[ ] OpenSource github.com/apple swift.org Stanfy MadCode #10

Slide 33

Slide 33 text

TODO Stanfy MadCode #10

Slide 34

Slide 34 text

[ ] KAPT pain ● Annotation processing is not fully functional yet ○ Better Annotation Processing: Supporting Stubs in kapt ● Mockito sometimes behaves wildly ○ How to use Mockito with Kotlin? ● New testing framework - Spek ○ http://jetbrains.github.io/spek/ ● Extension functions break incremental compilation ○ All hopes for new beta Stanfy MadCode #10

Slide 35

Slide 35 text

[ ] Anko - https://github.com/Kotlin/anko verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { toast("Hello, ${name.text}!") }
 }
 } Stanfy MadCode #10

Slide 36

Slide 36 text

[ ] TODO bottomLeftButton.performSelector( “_whyIsThisViewNotFocusable” ) Stanfy MadCode #10

Slide 37

Slide 37 text

[ ] TODO Stanfy MadCode #10

Slide 38

Slide 38 text

Thanks! Stanfy MadCode #10

Slide 39

Slide 39 text

Happy Holidays! Stanfy MadCode #10