46
Swift Thinking @NatashaTheRobot

Swift Thinking

Embed Size (px)

Citation preview

Page 1: Swift Thinking

Swift Thinking@NatashaTheRobot

Page 2: Swift Thinking

Back to December

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } return 0;}

Page 3: Swift Thinking

println("Hello, World!")

Page 4: Swift Thinking
Page 5: Swift Thinking
Page 6: Swift Thinking
Page 7: Swift Thinking
Page 8: Swift Thinking

—Optionals?!—Value Types—Higher-order functions

Page 9: Swift Thinking

Optionals?!

Page 10: Swift Thinking

"~40% of bugs shipped to customers in the last three years would have been caught immediately by using Swift" - Sunset Lake Software

Page 11: Swift Thinking
Page 12: Swift Thinking

enum Optional<T> { case Some(T) case None}

Page 13: Swift Thinking

let tSwiftAlbums = [ 2014 : "1989", 2012: "Red", 2010: "Speak Now", 2008: "Fearless", 2006: "Taylor Swift"]

let possibleAlbumFrom2011: String? = tSwiftAlbums[2011]let possibleAlbumFrom2014: String? = tSwiftAlbums[2014]

Page 14: Swift Thinking
Page 15: Swift Thinking

let tSwiftAlbums = [ 2014 : "1989", 2012: "Red", 2010: "Speak Now", 2008: "Fearless", 2006: "Taylor Swift"]

let possibleAlbumFrom2014: String? = tSwiftAlbums[2014]

if possibleAlbumFrom2014 == .None { println("Taylor Swift had no albums in 2014")} else { let albumFrom2014 = possibleAlbumFrom2014! println("Taylor Swift's 2014 album was \(albumFrom2014)")}

Page 16: Swift Thinking

let tSwiftAlbums = [ 2014 : "1989", 2012: "Red", 2010: "Speak Now", 2008: "Fearless", 2006: "Taylor Swift"]

if let albumFor2014 = tSwiftAlbums[2014] { println("Taylor Swift's 2014 album was \(albumFor2014)")} else { println("Taylor Swift had no albums in 2014")}

Page 17: Swift Thinking
Page 18: Swift Thinking

Value Types

Page 19: Swift Thinking

—structs—enums—(tuples)

Page 20: Swift Thinking

class Album { let title: String let artist: String var copiesSold: Int

init(title: String, artist: String, copiesSold: Int) { self.title = title self.artist = artist self.copiesSold = copiesSold }}

Page 21: Swift Thinking

let tSwift1989 = Album(title: "1989", artist: "Taylor Swift", copiesSold: 4505000)

func another1000Sales(forAlbum album: Album) { album.copiesSold += 1000}

another1000Sales(forAlbum: tSwift1989)tSwift1989.copiesSold // 4,506,000

Page 22: Swift Thinking

struct Album { let title: String let artist: String var copiesSold: Int}

Page 23: Swift Thinking

let tSwift1989 = Album(title: "1989", artist: "Taylor Swift", copiesSold: 4505000)

func another1000Sales(var forAlbum album: Album) { album.copiesSold += 1000 album.copiesSold // 4,506,000}

another1000Sales(forAlbum: tSwift1989)tSwift1989.copiesSold // 4,505,000

Page 24: Swift Thinking

Use a value type when:

—Comparing instance data with == makes sense—You want copies to have independent state—The data will be used in code across multiple

threads

Swift Blog: Value and Reference Types

Page 25: Swift Thinking

Use a reference type (e.g. use a class) when:

—Comparing instance identity with == makes sense—You want to create shared, mutable state

Swift Blog: Value and Reference Types

Page 26: Swift Thinking

"Almost all types in Swift are value types, including arrays, dictionaries, numbers, booleans, tuples, and enums. Classes are the exception rather than the rule." - Functional Swift Book

Page 27: Swift Thinking

$ grep -e "^struct " swift.md | wc -l 81

$ grep -e "^enum " swift.md | wc -l8

$ grep -e "^class " swift.md | wc -l3

Page 28: Swift Thinking

Higher-order Functions

Page 29: Swift Thinking

a higher-order function is a function that does at least one of the following:

—takes one or more functions as an input—outputs a function

- Wikipedia

Page 30: Swift Thinking

Array

—map—reduce—filter—flatMap

Page 31: Swift Thinking

struct Song { let title: String let album: String}

let tSwiftSongs = [ Song(title: "Blank Space", album: "1989"), Song(title: "All You Had to Do Was Stay", album: "Red"), Song(title: "Back to December", album: "Speak Now"), Song(title: "All You Had to Do Was Stay", album: "1989"), Song(title: "Begin Again", album: "Red"), Song(title: "Clean", album: "1989"), Song(title: "Love Story", album: "Fearless"), Song(title: "Shake It Off", album: "1989"), Song(title: "Bad Blood", album: "1989")]

Page 32: Swift Thinking

struct tSwift1989Album { let title = "1989" var songs = [Song]()}

Page 33: Swift Thinking

class tSwift1989Album { let title = "1989" var songs = [Song]()

func add1989Songs() { for song in tSwiftSongs { if song.album == "1989" { songs.append(song) } } } }

Page 34: Swift Thinking

let album = tSwift1989Album()album.add1989Songs()album.songs.count // 5

Page 35: Swift Thinking

let album = tSwift1989Album()album.add1989Songs()album.songs.count // 5

// MUCH FURTHER DOWNalbum.add1989Songs()

Page 36: Swift Thinking

let album = tSwift1989Album()album.add1989Songs()album.songs.count // 5

// MUCH FURTHER DOWNalbum.add1989Songs()album.songs.count // 10

Page 37: Swift Thinking

let album = tSwift1989Album()album.add1989Songs()album.songs.count // 5

album.add1989Songs()album.songs.count // 10

album.add1989Songs()album.songs.count // 15

album.add1989Songs()album.songs.count // 20

Page 38: Swift Thinking

/// Return an `Array` containing the elements `x` of `self` for which/// `includeElement(x)` is `true`func filter(includeElement: (T) -> Bool) -> [T]

Page 39: Swift Thinking

class tSwift1989Album { let title = "1989" var songs = [Song]()

func add1989SongsWithFilter() { songs = tSwiftSongs.filter({ song in song.album == "1989"}) } }

Page 40: Swift Thinking

songs = tSwiftSongs.filter({ song in song.album == "1989"})

Page 41: Swift Thinking

songs = tSwiftSongs.filter({ song in song.album == "1989"})

songs = tSwiftSongs.filter({ $0.album == "1989"})

Page 42: Swift Thinking

songs = tSwiftSongs.filter({ song in song.album == "1989"})

songs = tSwiftSongs.filter({ $0.album == "1989"})

songs = tSwiftSongs.filter { $0.album == "1989"}

Page 43: Swift Thinking

let album = tSwift1989Album()

album.add1989SongsWithFilter()album.songs.count // 5

album.add1989SongsWithFilter()album.songs.count // 5

album.add1989SongsWithFilter()album.songs.count // 5

album.add1989SongsWithFilter()album.songs.count // 5

album.add1989SongsWithFilter()album.songs.count // 5

Page 44: Swift Thinking
Page 45: Swift Thinking

Swift Thinking

—Optionals?!—Value Types —Higher-order functions

Page 46: Swift Thinking

Questions?!@NatashaTheRobot