Top Banner
THINK SHARP, WRITE SWIFT PASCAL BATTY
61

Think sharp, write swift

Jan 22, 2017

Download

Technology

scalbatty
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Think sharp, write swift

THINK SHARP, WRITE SWIFTPASCAL BATTY

Page 2: Think sharp, write swift

I’M A DEVELOPER

Page 3: Think sharp, write swift

I’VE ALWAYS BEEN A MAC NERD

Page 4: Think sharp, write swift
Page 5: Think sharp, write swift
Page 6: Think sharp, write swift

I SAW A LOT OF PEOPLE SWITCHING

Page 7: Think sharp, write swift

I DON’T EVEN…

Page 8: Think sharp, write swift

BASED ON SCIENTIFIC RESULTS

THE STAGES OF SWITCHING

😫 😯 😍

Page 9: Think sharp, write swift

iOS

OS X

Apps

Scripts + exe

OS X

Ubuntu

Page 10: Think sharp, write swift

C# Swift

Object Oriented ✓ ✓

Type Inference ✓ ✓

Generics ✓ ✓

Tuples ✓ ✓

Lambdas ✓ ✓

Optional Chaining ✓ ✓

String Interpolation ✓ ✓

Operator overloading ✓ ✓

SWIFT VS C# FEATURE COMPARISON CHART

Page 11: Think sharp, write swift

String Interpolation ✓ ✓

Operator overloading ✓ ✓

Null Coalescing ✓ ✓

Variadic Parameters ✓ ✓

Optional Parameters ✓ ✓

Extensions ✓ ✓

Auto-Properties ✓ ✓

Try/Catch ✓ ✓

Cool Logo ✓

Page 12: Think sharp, write swift

THE GOOD OLD FIBONACCI SEQUENCE

LET’S COMPARE CODE

func fib(n: Int) -> Int { var fib0 = 0, fib1 = 1

for var i = 2; i <= n; i++ { var tmp = fib0 fib0 = fib1 fib1 = tmp + fib1 }

return n > 0 ? fib1 : 0 }

static int fib(int n) { int fib0 = 0, fib1 = 1;

for (int i = 2; i <= n; i++) { int tmp = fib0; fib0 = fib1; fib1 = tmp + fib1; }

return (n > 0 ? fib1 : 0); }

C# Swift

as found on Wikibooks

Page 13: Think sharp, write swift

SWIFT AND C# ARE VERY SIMILAR

Page 14: Think sharp, write swift

C# Swift

Garbage Collection Reference Counting

Interface Protocol

Constructor Initializer

const let

Linq MapReduce

Lambda Closure

func<> ->

SWIFT AND C# ARE KINDA SORTA SIMILAR

Page 15: Think sharp, write swift

THE GOOD OLD FIBONACCI SEQUENCE

A FEW ADJUSTMENTS

func fib(n: Int) -> Int { var fib0 = 0, fib1 = 1

for var i = 2; i <= n; i++ { var tmp = fib0 fib0 = fib1 fib1 = tmp + fib1 }

return n > 0 ? fib1 : 0 }

Variable was never mutated; consider changing to ‘let’ constant

Page 16: Think sharp, write swift

THE GOOD OLD FIBONACCI SEQUENCE

A FEW ADJUSTMENTS

func fib(n: Int) -> Int { var fib0 = 0, fib1 = 1

for var i = 2; i <= n; i++ { let tmp = fib0 fib0 = fib1 fib1 = tmp + fib1 }

return n > 0 ? fib1 : 0 }

++ is deprecated: it will be removed in Swift 3

Page 17: Think sharp, write swift

THE GOOD OLD FIBONACCI SEQUENCE

A FEW ADJUSTMENTS

func fib(n: Int) -> Int { var fib0 = 0, fib1 = 1

for var i = 2; i <= n; i += 1 { let tmp = fib0 fib0 = fib1 fib1 = tmp + fib1 }

return n > 0 ? fib1 : 0 }

C-Style for statement is deprecated and will be removed…

Page 18: Think sharp, write swift

THE GOOD OLD FIBONACCI SEQUENCE

A FEW ADJUSTMENTS

func fib(n: Int) -> Int { var fib0 = 0, fib1 = 1

for i in 2...n { let tmp = fib0 fib0 = fib1 fib1 = tmp + fib1 }

return n > 0 ? fib1 : 0 }

Immutable value ‘i’ was never used; consider replacing with ‘_’

Page 19: Think sharp, write swift

THE GOOD OLD FIBONACCI SEQUENCE

A FEW ADJUSTMENTS

func fib(n: Int) -> Int { var fib0 = 0, fib1 = 1

for _ in 2...n { let tmp = fib0 fib0 = fib1 fib1 = tmp + fib1 }

return n > 0 ? fib1 : 0 }

😌

Page 20: Think sharp, write swift

THE COMPILER IS PICKY BUT FRIENDLY

Page 21: Think sharp, write swift

TYPE SYSTEM

Page 22: Think sharp, write swift

LET US DIVE IN A LITTLE DEEPER

BUILDING BLOCKS

Class

Properties

Initializers

Instance Methods

Class Methods

Struct

Properties

Initializers

Instance methods

Static methods

Enum

Properties

Initializers

Instance methods

Static methods

Page 23: Think sharp, write swift

VALUE TYPES ARE AWESOME

Page 24: Think sharp, write swift

I CAN’T ASK YOU TO JUST BELIEVE ME ON THIS

VALUE TYPES ARE AWESOME

▸ Immutability ensured by ‘let’

▸ No expensive boxing/unboxing

▸ Code is more thread-safe

▸ Performance is better

▸ Functional Programming is more convenient

Page 25: Think sharp, write swift

LET US DIVE IN A LITTLE DEEPER

STANDARD TYPES▸ Int, Float, Double

▸ Bool

▸ String, Character

▸ Array<T>, Dictionary<K: Hashable, V>, Set<T: Hashable>

THESE ARE ALL STRUCTS!

Page 26: Think sharp, write swift

ENUMERABLES YOU WON’T BELIEVE WHAT HAPPENS NEXT…

Page 27: Think sharp, write swift

BRACE YOURSELVES…

ENUMERABLES AS YOU MAY KNOW THEM

enum Land { case Forest case Mountain case Swamp case Plains case Island }

enum Error : Int { case NotFound = 404 case ServerError = 500 case Forbidden = 403 case Teapot = 418 }

Raw value can be String, Character or any numeric type

Page 28: Think sharp, write swift

HERE COMES!

ENUMERABLES WITH ASSOCIATED VALUES!enum PaymentMethod { case Cash case Check (Int) case CreditCard (CardType, Int)

enum CardType { case Visa, MasterCard, Electron } func display() { switch self { case Cash: print("Paid by cash") case let Check(number): print("Paid by check #\(number)") case let CreditCard(type, number): print("Paid by \(type) #\(number)") } } }

let method = PaymentMethod.CreditCard(.Visa, 995423) method.display()

Page 29: Think sharp, write swift

NOT OVER YET!

… AND GENERICS!enum Result<T, U> { case Success(T) case Error(U) }

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

indirect enum Tree<T> { case Empty case Node(T, left: Tree<T>, right: Tree<T>) }

Page 30: Think sharp, write swift

OPTIONALS (SPOILER: THEY’RE PRETTY COOL)

Page 31: Think sharp, write swift

WHAT YOU MAY END UP DOING…

OPTIONALS IN THE WILD

let answer: String = "42" let numericAnswer = Int(answer)

let byOneThousand = numericAnswer * 1000

let nineThousand: Float = 9 * 1000

let vegetaSays: String = "It's over \(nineThousand) !!" let nappaSays: String = "What!? " + String(nineThousand) + "?!"

VALUE OF OPTIONAL TYPE ‘INT?’ NOT UNWRAPPED; DID YOU MEAN TO USE ‘!’ OR ‘?’ ?

Int?

Page 32: Think sharp, write swift

BEAR WITH ME THERE

OPTIONALS

▸ Like nullables for all types!

▸ Variables, constants, arguments, properties or return values

▸ You can’t use its value unless you unwrap it first

▸ If it is not Optional, it can never be nil

Page 33: Think sharp, write swift

FORGOT TO CHECK NULLABILITY?

WON’T LET YOU USE THE VALUE

Page 34: Think sharp, write swift

DO YOU KNOW THE ‘MAYBE’ MONAD ?

UNWRAPPING THE OPTIONAL

42

let answer: String = getAnswer() let numericAnswer: Int? = Int(answer)

processNumericAnswer(numericAnswer)

???Int?

Int nil

Page 35: Think sharp, write swift

DO YOU KNOW THE ‘MAYBE’ MONAD ?

UNWRAPPING THE OPTIONAL

42

let answer: String = getAnswer() let numericAnswer: Int? = Int(answer)

if let realAnswer: Int = numericAnswer { processNumericAnswer(realAnswer) } else { print("Please give a number") } nil

Int?Int?

Page 36: Think sharp, write swift

NOT EVERYTHING IS COMPULSORY

OPTIONAL PROPERTIES

struct Contact { var firstName:String var middleName:String? var lastName:String var emailAddress:String var emailVerified:Bool }

Page 37: Think sharp, write swift

THAT’S A LOT OF PUNCTUATION!

NULL COALESCING AND OPTIONAL CHAINING

let answer: String = getAnswer() let numericAnswer: Int? = Int(answer)

let sanitizedAnswer: Int = numericAnswer ?? 1 processNumericAnswer(sanitizedAnswer)

let contact: Contact? = getContact()

let email: String? = contact?.emailAddress

??

?.

Page 38: Think sharp, write swift

FAMOUS LAST WORDS…

FORCE UNWRAP & IMPLICITLY UNWRAPPED OPTIONALS

!« I KNOW WHAT I’M DOING. IF YOU ENCOUNTER AN UNEXPECTED NIL JUST CRASH AT RUNTIME »

Page 39: Think sharp, write swift

THERE’S MORE!

Page 40: Think sharp, write swift

PUT SOME LOGIC INSIDE YOUR TYPES!

FUN WITH PROPERTIESstruct Contact { var firstName: String var middleName: String? var lastName: String

let securityNumber: Int var fullName: String { if let initial = middleName?.characters.first { return "\(firstName) \(initial). \(lastName)" } else { return "\(firstName) \(lastName)" } } var emailVerified: Bool var emailAddress: String { didSet { emailVerified = false } } }

Page 41: Think sharp, write swift

MAP, FILTER, REDUCE, SORT

CLOSURESlet people:[Contact] = getContacts() let targetNames:[String] = people .filter({ contact in contact.lastName.hasPrefix("G") }) .map({ contact in contact.fullName }) .sort()

func multipleOf(factor: Int) -> Int -> Bool { return { (number: Int) in number % factor == 0 } }

let isEven = multipleOf(2) isEven(4)

// Get the sum of multiples of 3 up to 100

(1...100) .filter(multipleOf(3)) .reduce(0, combine: +)

https://github.com/mythz/swift-linq-examples

Page 42: Think sharp, write swift

FUNCTIONAL PROGRAMMING

Page 43: Think sharp, write swift

IMAGINE THE POSSIBILITIES…

EXTENSIONS & PROTOCOLSextension Contact { func composeEmailBoilerplate() -> String { … } var abbreviatedName: String { … } }

protocol StringSerializable { func serialize() -> String }

extension StringSerializable { func serialize() -> String { return "" }

}

extension Contact: StringSerializable { func serialize() -> String { … } }

Page 44: Think sharp, write swift

PROTOCOL-ORIENTED PROGRAMMING

Page 45: Think sharp, write swift

WHERE TO START

Page 46: Think sharp, write swift

YOU’VE GOT TO START SOMEWHERE

YOUR LEARNING ENVIRONMENT

OS X Ubuntu Windows

XcodePlayground

REPL UbuntuBash

Page 47: Think sharp, write swift

WHEREVER YOU ARE

SWIFT SANDBOX

https://swiftlang.ng.bluemix.net

Page 48: Think sharp, write swift

ONE OF THE PERKS OF DOING SWIFT ON THE MAC

PLAYGROUND

Page 49: Think sharp, write swift

BECAUSE WE DON’T HAVE THE TIME TO SEE EVERYTHING

LEARN

▸ Updated eBook from Apple

▸ Available for free

▸ on iBooks

▸ on swift.org

▸ swiftdoc.org is a nice and fast documentation website

Page 50: Think sharp, write swift

SOLVE PROBLEMS!

Exercism.io Codingame.com

Page 51: Think sharp, write swift

😫

Picky Compiler

SyntaxError Handling

Optionals

IncompleteGenerics

ArgumentNaming

Noasync/await

Value Types

for loops

Page 52: Think sharp, write swift

A POLARIZING ASPECT

ARGUMENT NAMING

(1...100) .filter(multipleOf(3)) .reduce(0, combine: +)

array.insert(0, 4)

array.insert(0, atIndex: 4)

Page 53: Think sharp, write swift

😫

Picky Compiler

SyntaxError Handling

Optionals

IncompleteGenerics

ArgumentNaming

Noasync/await

Value Types

for loops

Page 54: Think sharp, write swift

😯

Expressive code

guard.map().reduce()

Optionals

defer

AssociatedTypes Protocols

typedefEverything

enums

ClosuresValue Semantics

Page 55: Think sharp, write swift

A CONVENTION-CREATING KEYWORD

GUARD

func multipleOf(factor: Int) -> Int -> Bool { return { (number: Int) in number % factor == 0 } }

Page 56: Think sharp, write swift

A CONVENTION-CREATING KEYWORD

GUARD

func multipleOf(factor: Int) -> Int -> Bool { guard factor != 0 else { return { _ in false } } return { (number: Int) in number % factor == 0 } }

Page 57: Think sharp, write swift

😯

Expressive code

guard.map().reduce()

Optionals

defer

AssociatedTypes Protocols

typedefEverything

enums

ClosuresValue Semantics

Page 58: Think sharp, write swift

😍

Object-Oriented Programming

Functional Programming

Protocol-OrientedProgramming

Page 59: Think sharp, write swift

THINK SHARP, WRITE SWIFT

Page 60: Think sharp, write swift

THINK SWIFT

Page 61: Think sharp, write swift

THANK YOU 💙Pascal Batty

@scalbattyscalbattyblog.soat.fr https://github.com/scalbatty/Think-Sharp-Write-Swift