Slide 1

Slide 1 text

SWIFT FOR JAVASCRIPT DEVELOPERS

Slide 2

Slide 2 text

WHO AM I?

Slide 3

Slide 3 text

JP SIMARD @SIMJP REALM.IO

Slide 4

Slide 4 text

GITHUB.COM/REALM/REALM-COCOA

Slide 5

Slide 5 text

SPONSORS

Slide 6

Slide 6 text

▸ PubNub ▸ DeNA ▸ FastForwardJS ▸ newcircle ▸ loop/recur ▸ wework ▸ SiliconValley CodeCamp

Slide 7

Slide 7 text

at WWDC...

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

RUNS IN SWIFT & JS var strings = ["a", "b"] strings.reverse() strings[0]

Slide 10

Slide 10 text

RUNS IN SWIFT & JS var strings = ["a", "b"] // => [a, b] strings.reverse() // => [b, a] strings[0] // => Swift: a, JS: b

Slide 11

Slide 11 text

SIMILARITIES ▸ Syntax ▸ REPL ▸ Scripting feel

Slide 12

Slide 12 text

DIFFERENCES ▸ Swift is still a compiled language ▸ API's, Libraries & Frameworks ▸ Type safety & generics ▸ Functional concepts ▸ Swift will never work in-browser

Slide 13

Slide 13 text

WHAT WOULD IT TAKE TO...

Slide 14

Slide 14 text

... RUN SWIFT OUTSIDE IOS/OSX 1. Open source Swift compiler 2. Open source Swift runtime 3. Open source Swift standard library Objective-C is 30 years old and they still haven't done #3.

Slide 15

Slide 15 text

NODE REPL == SWIFT REPL + PLAYGROUNDS

Slide 16

Slide 16 text

xcrun swift

Slide 17

Slide 17 text

DEMO

Slide 18

Slide 18 text

1. Classes 2. Callbacks 3. Promises 4. Type Safety & Inference 5. Tuples 6. Mutability 7. Functional Programming 8. Generics

Slide 19

Slide 19 text

1. CLASSES

Slide 20

Slide 20 text

JS "CLASS" function Car(model){ this.model = model; } Car.prototype.drive = function() { return 'Driving my ' + this.model; } var car = new car('Batmobile'); car.drive(); // => Driving my Batmobile

Slide 21

Slide 21 text

SWIFT CLASS class Car { var model = "" func drive() -> String { return "Driving my " + model } } let car = Car() car.model = "Batmobile" car.drive()

Slide 22

Slide 22 text

2. CALLBACKS

Slide 23

Slide 23 text

JS CALLBACKS var log = function(txt, done) { setTimeout(function() { console.log('callbacks are ' + txt); done(); }, 1000) } log('awesome', function() { console.log('and done'); });

Slide 24

Slide 24 text

SWIFT CALLBACKS func log(txt: String, completion: () -> ()) { var delta = 1 * Int64(NSEC_PER_SEC) var time = dispatch_time(DISPATCH_TIME_NOW, delta) dispatch_after(time, dispatch_get_main_queue()) { println("closures are " + txt) } } log("not the same as JS closures") { println("and done") }

Slide 25

Slide 25 text

3. PROMISES

Slide 26

Slide 26 text

JS PROMISES var log = function(txt) { return new Promise((resolve) => { setTimeout(function() { console.log('promises are ' + txt); resolve(); }, 1000) }) } log('the future').then(() => { console.log('and done'); });

Slide 27

Slide 27 text

SWIFT PROMISES func log(txt: String, #resolve: () -> (), #reject: () -> ()) { var delta = 1 * Int64(NSEC_PER_SEC) var time = dispatch_time(DISPATCH_TIME_NOW, delta) dispatch_after(time, dispatch_get_main_queue()) { println("closures are " + txt) resolve() } } log("not the same as JS closures", resolve: { println("and done") }, reject: { // handle errors })

Slide 28

Slide 28 text

4. TYPE SAFETY & INFERENCE

Slide 29

Slide 29 text

TYPE SAFETY & INFERENCE let anInt = 3 let aFloat = 0.1416 var pi = anInt + aFloat // Compile warning pi = 3 + 0.1416 // Compiles: number literals are untyped LIKE RUST & SCALA

Slide 30

Slide 30 text

5. TUPLES

Slide 31

Slide 31 text

TUPLES let http404Error = (404, "Not Found") http404Error.0 // => 404 http404Error.1 // => Not Found SWIFT ❤ JAVASCRIPT

Slide 32

Slide 32 text

6. MUTABILITY

Slide 33

Slide 33 text

RUNS IN SWIFT & JS var strings = ["a", "b"] // => [a, b] strings.reverse() // => [b, a] strings[0] // => Swift: a, JS: b

Slide 34

Slide 34 text

MUTABILITY IN SWIFT ▸ var is mutable ▸ let is immutable var letter = "a" letter = b // works let a = "a" a = "b" // compilation error

Slide 35

Slide 35 text

MUTABILITY IN JAVASCRIPT ▸ var is mutable ▸ let is mutable (only limits scope) ▸ const is immutable (only in FireFox & Chrome)

Slide 36

Slide 36 text

Object.freeze() IN JAVASCRIPT var obj = { foo: "bar" }; obj.foo = "baz"; // works Object.freeze(obj); // freezes obj obj.foo = "bar"; // silently does nothing

Slide 37

Slide 37 text

7. FUNCTIONAL PROGRAMMING

Slide 38

Slide 38 text

FUNCTIONAL PROGRAMMING let numbers = [1, 5, 3, 12, 2] numbers.map { (number: Int) -> Int in return 3 * number } // => [3, 15, 9, 36, 6] numbers.filter {$0 % 2 == 0} // => [12, 2] LIKE UNDERSCORE.JS

Slide 39

Slide 39 text

8. GENERICS

Slide 40

Slide 40 text

// Reimplement the Swift standard // library's optional type enum OptionalValue { case None case Some(T) } var maybeInt: OptionalValue = .None maybeInt = .Some(100) // Specialized Array var letters: [Array] letters = ["a"]

Slide 41

Slide 41 text

LOTS MORE! ▸ Optionals ▸ Super-Enums ™ ▸ Structs ▸ Pattern Matching ▸ Runtime

Slide 42

Slide 42 text

SWIFT != JS

Slide 43

Slide 43 text

But!!!

Slide 44

Slide 44 text

SWIFT ❤ JS

Slide 45

Slide 45 text

LINKS () ▸ Official Swift website (and blog) ▸ The Swift Programming Language Book ▸ WWDC Videos ▸ WWDC Sample Code ▸ Xcode 6 (and other resources) Free Apple Developer Account Required

Slide 46

Slide 46 text

LINKS (!) ▸ This talk: github.com/jpsim/talks ▸ MircoZeiss: Swift for JavaScript Developers (!x") ▸ ModusCreate: JavaScript Take on Swift ▸ DockYard: Swift and JavaScript ▸ Swift on StackOverflow

Slide 47

Slide 47 text

THANK YOU!

Slide 48

Slide 48 text

Meetup().questions?.askThem!

Slide 49

Slide 49 text

Meetup().questions?.askThem! JP SIMARD, @SIMJP, REALM.IO