Good Morning SWIFT HI! I'm Marc Prud'hommeaux marc@glimpse.io - - PowerPoint PPT Presentation

good morning swift hi
SMART_READER_LITE
LIVE PREVIEW

Good Morning SWIFT HI! I'm Marc Prud'hommeaux marc@glimpse.io - - PowerPoint PPT Presentation

Good Morning SWIFT HI! I'm Marc Prud'hommeaux marc@glimpse.io Swift Public beta: June 2014 v1.0: September 2014 v1.2: February 2015 POLL: Swift? Agenda 1. Swift Syntax 2. Interesting Stuff 3. Questions (GOTO Guide) // Swift Bank &


slide-1
SLIDE 1

Good Morning

slide-2
SLIDE 2

SWIFT

slide-3
SLIDE 3

HI!

I'm Marc Prud'hommeaux

marc@glimpse.io

slide-4
SLIDE 4

Swift

Public beta: June 2014 v1.0: September 2014 v1.2: February 2015

slide-5
SLIDE 5

POLL: Swift?

slide-6
SLIDE 6

Agenda

  • 1. Swift Syntax
  • 2. Interesting Stuff
  • 3. Questions (GOTO Guide)
slide-7
SLIDE 7 // Swift Bank & Account class Bank { var accounts: Array<Account> init() { self.accounts = Array<Account>() } func addAccount(account: Account) { accounts.append(account) } func holdings() -> Int { var amount: Int = 0 for (account: Account) in accounts { amount += account.pennies } return amount } } class Account { var owner: String? var pennies: Int init(owner: String, pennies: Int) { self.owner = owner self.pennies = pennies } func deposit(amount: Int) { self.pennies += amount } func withdraw(amount: Int) { self.pennies -= amount } }
slide-8
SLIDE 8 // Objective-C Bank & Account @interface Bank : NSObject @property NSMutableArray *accounts; @end @interface Account : NSObject @property NSString *owner; @property int pennies; @end @implementation Bank
  • (id)init {
if (self = [super init]) { self.accounts = [[NSMutableArray alloc] init]; } return self; }
  • (void)addAccount:(Account *)account {
[self.accounts addObject:account]; }
  • (int)holdings {
int amount = 0; for (Account *account in self.accounts) { amount += account.pennies; } return amount; } @end @implementation Account
  • (id)initWithOwner:(NSString *)owner pennies:(int)pennies {
if (self = [super init]) { self.owner = owner; self.pennies = pennies; } return self; }
  • (void)deposit:(int)amount {
self.pennies += amount; }
  • (void)withdraw:(int)amount {
self.pennies -= amount; } @end
slide-9
SLIDE 9 // Java Bank & Account class Bank { List<Account> accounts; Bank() { this.accounts = new ArrayList<Account>(); } void addAccount(Account account) { accounts.add(account); } int holdings() { int amount = 0; for (Account account : accounts) { amount += account.pennies; } return amount; } } class Account { String owner; int pennies; Account(String owner, int pennies) { this.owner = owner; this.pennies = pennies; } void deposit(int amount) { this.pennies += amount; } void withdraw(int amount) { this.pennies -= amount; } }
slide-10
SLIDE 10 // Swift Bank & Account class Bank { var accounts: Array<Account> init() { self.accounts = Array<Account>() } func addAccount(account: Account) { accounts.append(account) } func holdings() -> Int { var amount: Int = 0 for (account: Account) in accounts { amount += account.pennies } return amount } } class Account { var owner: String? var pennies: Int init(owner: String, pennies: Int) { self.owner = owner self.pennies = pennies } func deposit(amount: Int) { self.pennies += amount } func withdraw(amount: Int) { self.pennies -= amount } }
slide-11
SLIDE 11 // Java Bank & Account class Bank { List<Account> accounts; Bank() { this.accounts = new ArrayList<Account>(); } void addAccount(Account account) { accounts.add(account); } int holdings() { int amount = 0; for (Account account : accounts) { amount += account.pennies; } return amount; } } class Account { String owner; int pennies; Account(String owner, int pennies) { this.owner = owner; this.pennies = pennies; } void deposit(int amount) { this.pennies += amount; } void withdraw(int amount) { this.pennies -= amount; } }
slide-12
SLIDE 12 // Swift Bank & Account class Bank { var accounts: Array<Account> init() { self.accounts = Array<Account>() } func addAccount(account: Account) { accounts.append(account) } func holdings() -> Int { var amount: Int = 0 for (account: Account) in accounts { amount += account.pennies } return amount } } class Account { var owner: String? var pennies: Int init(owner: String, pennies: Int) { self.owner = owner self.pennies = pennies } func deposit(amount: Int) { self.pennies += amount } func withdraw(amount: Int) { self.pennies -= amount } }
slide-13
SLIDE 13 // Java Bank & Account class Bank { List<Account> accounts; Bank() { this.accounts = new ArrayList<Account>(); } void addAccount(Account account) { accounts.add(account); } int holdings() { int amount = 0; for (Account account : accounts) { amount += account.pennies; } return amount; } } class Account { String owner; int pennies; Account(String owner, int pennies) { this.owner = owner; this.pennies = pennies; } void deposit(int amount) { this.pennies += amount; } void withdraw(int amount) { this.pennies -= amount; } }
slide-14
SLIDE 14 // Swift Bank & Account class Bank { var accounts: Array<Account> init() { self.accounts = Array<Account>() } func addAccount(account: Account) { accounts.append(account) } func holdings() -> Int { var amount: Int = 0 for (account: Account) in accounts { amount += account.pennies } return amount } } class Account { var owner: String? var pennies: Int init(owner: String, pennies: Int) { self.owner = owner self.pennies = pennies } func deposit(amount: Int) { self.pennies += amount } func withdraw(amount: Int) { self.pennies -= amount } }
slide-15
SLIDE 15

Generics

var strings: Array<String> = ["a", "b", "c"] strings.append("d") strings.append(1.2) // error!
slide-16
SLIDE 16

Type Inference

var num : Int = 1 var strings : [String] = ["a", "b", "c"] var dictionary : [String: Double] = ["a": 1.1, "b": 2.2]
slide-17
SLIDE 17

Type Inference

var num = 1 var strings = ["a", "b", "c"] var dictionary = ["a": 1.1, "b": 2.2]

slide-18
SLIDE 18
  • ptionals

var str: String? = "Hello" str = "World" str = nil // legal

slide-19
SLIDE 19
  • ptionals

var str: String = "Hello" str = "World" str = nil // illegal!

slide-20
SLIDE 20
  • ptional chaining
var pennies: Int? = account.owner?.deposit?.amount if pennies != nil { // neither owner nor deposit was nil }
slide-21
SLIDE 21

tuples

var twoInts: (Int, Int) = (1, 2)

slide-22
SLIDE 22

tuples

var twoStrings: (String, String) = ("dog", "cow")
slide-23
SLIDE 23

tuples

var someStuff: (String, Double, Account) = ("Marc", 1.23, myAccount)
slide-24
SLIDE 24

tuples

func minMax(array: [Int]) -> (min: Int, max: Int) { var currentMin = array[0] var currentMax = array[0] for value in array[1..<array.count] { if value < currentMin { currentMin = value } else if value > currentMax { currentMax = value } } return (currentMin, currentMax) }
slide-25
SLIDE 25

enums

slide-26
SLIDE 26

enums

slide-27
SLIDE 27

enums

slide-28
SLIDE 28

enums

slide-29
SLIDE 29

functions

slide-30
SLIDE 30

functions

slide-31
SLIDE 31

functions

slide-32
SLIDE 32

functions

slide-33
SLIDE 33

functions

slide-34
SLIDE 34

functions

slide-35
SLIDE 35

functions

slide-36
SLIDE 36

functions

slide-37
SLIDE 37

higher-order functions

slide-38
SLIDE 38

function currying

slide-39
SLIDE 39

functions

slide-40
SLIDE 40

multi-paradigm

slide-41
SLIDE 41

multi-paradigm

  • Functional + Object-Oriented & Imperative
slide-42
SLIDE 42
  • perator
  • verloading
slide-43
SLIDE 43
  • perators as

functions

slide-44
SLIDE 44 func isOrderedBefore(s1: String, s2: String)->Bool { return s1 < s2 } var words = ["dog", "cow"] words.sort(isOrderedBefore)
slide-45
SLIDE 45

var words = ["dog", "cow"] words.sort({ (s1: String, s2: String) in return s1 < s2 })

slide-46
SLIDE 46

var words = ["dog", "cow"] words.sort(<) // => "cow", "dog" words.sort(>) // => "dog", "cow"

slide-47
SLIDE 47

Immutable Structs

slide-48
SLIDE 48

Other Features

  • Access Control
  • Bridging to Objective-C
  • Automatic Reference Counting (no GC)
  • Protocol (i.e., interfaces)
  • Categories (i.e., type extensions)
  • And Much, Much More!
slide-49
SLIDE 49 var explicitDouble: Double = 70 var implicitInteger = 70 var implicitDouble = 70.0 var = "" let numberOfBananas: Int = 10 let numberOfApples = 3 let numberOfOranges = 5 let appleSummary = "I have \(numberOfApples) apples." let fruitSummary = "I have \(numberOfApples + numberOfOranges) pieces of fruit." var fruits = ["mango", "kiwi", "avocado"] if fruits.isEmpty { println("No fruits in my array.") } else { println("There are \(fruits.count) items in my array") } let people = ["Anna": 67, "Beto": 8, "Jack": 33, "Sam": 25] for (name, age) in people { println("\(name) is \(age) years old.") } func sayHello(personName: String) -> String { let greeting = "Hello, " + personName + "!" return greeting } println(sayHello("Jane")) func sayAge(#personName: String, personAge Age: Int) -> String { let result = "\(personName) is \(Age) years old." return result } // we can also specify the name of the parameter println(sayAge(personName: "Jane", personAge: 42))
slide-50
SLIDE 50

Immutable Values

slide-51
SLIDE 51

Definitions

slide-52
SLIDE 52

Definitions

  • Mutability:
  • Immutability:
slide-53
SLIDE 53

Definitions

  • Mutability: changeable
  • Immutability: unchangable
slide-54
SLIDE 54

All Languages have Some

final int i = 42; i++; // illegal!

slide-55
SLIDE 55

let

let i = 42 i++ // illegal!

slide-56
SLIDE 56

Immutability

slide-57
SLIDE 57

Value Types

slide-58
SLIDE 58

Value Types

  • Unshared
slide-59
SLIDE 59

Value Types

  • Value Types: Unshared
  • Reference Types: Shared
slide-60
SLIDE 60

Primitives are Values

// java int i = 42; int j = i; i++; // i = 43, j = 42

slide-61
SLIDE 61

Immutability in Java

Animal a = new Animal("dog"); Animal b = a; b.type; // "dog" a.type = "cow"; b.type; // "cow"

slide-62
SLIDE 62

Immutability in Java

final Animal a = new Animal("dog"); final Animal b = a; b.type; // "dog" a.type = "cow"; b.type; // "cow"

slide-63
SLIDE 63

final Animal a = new Animal("dog"); final Animal b = a; b.type; // "dog" a.type = "cow"; b.type; // "cow" b = new Animal("moose"); // illegal!

slide-64
SLIDE 64

Reference vs. Value Types

class Animal { var type: String } let a = new Animal("dog") let b = a b.type // "dog" a.type = "cow" b.type // "cow"

slide-65
SLIDE 65

Reference vs. Value Types

struct Animal { var type: String } var a = new Animal("dog") var b = a b.type // "dog" a.type = "cow" b.type // "dog" <-------

slide-66
SLIDE 66

Reference vs. Value Types

Similarities

slide-67
SLIDE 67

Reference vs. Value Types

Similarities

  • contain properties
slide-68
SLIDE 68

Reference vs. Value Types

Similarities

  • contain properties
  • contain methods
slide-69
SLIDE 69

Reference vs. Value Types

Similarities

  • contain properties
  • contain methods
  • contain initializers
slide-70
SLIDE 70

Reference vs. Value Types

Similarities

  • contain properties
  • contain methods
  • contain initializers
  • conform to protocols
slide-71
SLIDE 71

Reference vs. Value Types

Differences

  • cannot inherit
slide-72
SLIDE 72

Reference vs. Value Types

Differences

  • cannot inherit
  • no identity
slide-73
SLIDE 73

Reference vs. Value Types

Differences

  • cannot inherit
  • no identity
  • unshared
  • immutable
slide-74
SLIDE 74

struct Animal { var type: String } var a = new Animal("dog") a.type = "cow"

slide-75
SLIDE 75

struct Animal { var type: String } var a = new Animal("dog") var b = a b.type // "dog" a.type = "cow" b.type // "dog" <-------

slide-76
SLIDE 76 struct Bank { var accounts: [Account] = [] var holdings: Int { return accounts.map({ $0.pennies }).reduce(0, combine: +) } } struct Account { var owner: String var pennies: Int = 0 } var bank = Bank() var a1 = Account(owner: "Marc", pennies: 100) bank.accounts += [a1] var a2 = Account(owner: "Dave", pennies: 1_000) bank.accounts += [a2] bank.holdings // => 1,100 bank.accounts[0].pennies -= 50 bank.holdings // => 1,050
slide-77
SLIDE 77 struct Bank { var accounts: [Account] = [] var holdings: Int { return accounts.map({ $0.pennies }).reduce(0, combine: +) } } struct Account { var owner: String var pennies: Int = 0 } var bank = Bank() var a1 = Account(owner: "Marc", pennies: 100) bank.accounts += [a1] var a2 = Account(owner: "Dave", pennies: 1_000) bank.accounts += [a2] bank.holdings // => 1,100 bank.accounts[0].pennies -= 50 bank.holdings // => 1,050 a1.pennies -= 50 bank.holdings // => 1,050 // !?!
slide-78
SLIDE 78

Deceptive!

slide-79
SLIDE 79

But convenient

slide-80
SLIDE 80

Strings in Java: pretend references

slide-81
SLIDE 81

Strings in Swift: true references

slide-82
SLIDE 82

Values all the way down

slide-83
SLIDE 83

So What?

slide-84
SLIDE 84

Benefits

slide-85
SLIDE 85

Benefits

  • 1. comprehensible
slide-86
SLIDE 86

Benefits

  • 1. comprehensible
  • 2. testable
slide-87
SLIDE 87

Benefits

  • 1. comprehensible
  • 2. testable
  • 3. parallel
slide-88
SLIDE 88

Benefits

  • 1. comprehensible
  • 2. testable
  • 3. parallel
  • 4. portable
slide-89
SLIDE 89

Not 100%

slide-90
SLIDE 90

Mac & iOS are built on reference types

slide-91
SLIDE 91

Your App

  • X% references
  • Y% values
slide-92
SLIDE 92

Model

slide-93
SLIDE 93

Benefits

  • 1. comprehensible
  • 2. testable
  • 3. parallel
  • 4. portable
slide-94
SLIDE 94

comprehensible

slide-95
SLIDE 95

testable

slide-96
SLIDE 96

parallel

slide-97
SLIDE 97

portable

slide-98
SLIDE 98

The Value of Values

  • 1. comprehensible
  • 2. testable
  • 3. parallel
  • 4. portable
slide-99
SLIDE 99

Questions?

slide-100
SLIDE 100
slide-101
SLIDE 101

Thank You!

Please Rate using the GOTO Guide!

slide-102
SLIDE 102

Thank You!

Marc Prud’hommeaux – marc@glimpse.io

Please rate this session with the GOTO Guide App