How would you describe Swift in three words?

107
Intermediate Swift @ColinEberhardt ShinobiControls

description

A talk I delivered at iOSDevUK 2014

Transcript of How would you describe Swift in three words?

Page 1: How would you describe Swift in three words?

Intermediate Swift

@ColinEberhardt ShinobiControls

Page 2: How would you describe Swift in three words?
Page 3: How would you describe Swift in three words?

How would you describe Swift in three words?

Page 4: How would you describe Swift in three words?

JavaBoringSimpleGang of Four

Page 5: How would you describe Swift in three words?

C#ExpressiveFunJava++

Page 6: How would you describe Swift in three words?

JavaScriptRapidSimpleBroken!

Page 7: How would you describe Swift in three words?

Objective-CPowerfulUgly

Page 8: How would you describe Swift in three words?

Swift????

Page 9: How would you describe Swift in three words?

Swift hates nil

Page 10: How would you describe Swift in three words?

Value Types

Reference Types

nill-able references

Objective-C ✓ ✓ ✓Java ✓ ✓ ✓

JavaScript ✓ ✓ ✓C# ✓ ✓ ✓

Swift ✓ ✓ ✗

† Non extensible

Page 11: How would you describe Swift in three words?

nil is a bad thing

Page 12: How would you describe Swift in three words?

RACSignal *signal = [[self.services getFlickrSearchService] flickrImageMetadata:self.photo.identifier];

Page 13: How would you describe Swift in three words?

RACSignal *signal; if (self.services && self.photo && self.photo.identifier) { id<RWTFlickrSearch> searchService = [self.services getFlickrSearchService]; if (searchService) { signal = [searchService flickrImageMetadata:self.photo.identifier]; } }

RACSignal *signal = [[self.services getFlickrSearchService] flickrImageMetadata:self.photo.identifier];

Page 14: How would you describe Swift in three words?

Opt-in with Optionals

Page 15: How would you describe Swift in three words?

var person: String? !!var car: String? = "Porsche"

Page 16: How would you describe Swift in three words?

var car: String? // car is nil car = "Porsche" !// checked if let actuallyACar = car { if actuallyACar.hasPrefix("P") { println("It's a 'P'") } } !// unchecked // fatal error: unexpectedly found nil while // unwrapping an Optional value if car!.hasPrefix("P") { println("It's a 'P'") } !// chaining if let hasPrefix = car?.hasPrefix("P") { if hasPrefix { println("It's a 'P'") } }

Page 17: How would you describe Swift in three words?

Swift likes sugar

Page 18: How would you describe Swift in three words?

var car: String? !!var car: Optional<String> = "Porsche"

Page 19: How would you describe Swift in three words?

enum Optional<T> : Reflectable, NilLiteralConvertible { case None case Some(T) init() var hasValue: Bool { get } ! static func convertFromNilLiteral() -> T? }

Page 20: How would you describe Swift in three words?

// sugar free var car: Optional<String> = "Porsche" !switch car { case .None: println("nothing here") case .Some(let actuallyACar): if actuallyACar.hasPrefix("P") { println("It's a 'P'") } }

// checked if let actuallyACar = car { if actuallyACar.hasPrefix("P") { println("It's a 'P'") } }

Page 21: How would you describe Swift in three words?

Opt-out of unwrapping with implicit optionals

Page 22: How would you describe Swift in three words?

var car: String! = "Porsche" !// unchecked - minus the unwrapping if car.hasPrefix("P") { println("It's a 'P'") }

Page 23: How would you describe Swift in three words?

Swift meets Objective-C

Page 24: How would you describe Swift in three words?

Objective-C permits nil

… as a result anything returned by the APIs could be a nil reference

Page 25: How would you describe Swift in three words?

AnyObject!

Page 26: How would you describe Swift in three words?

Variables are always surprised! or confused?

Page 27: How would you describe Swift in three words?

Swift initialisation is strict

Page 28: How would you describe Swift in three words?

Swift initialisation is really strict

Page 29: How would you describe Swift in three words?

The Commandments

Page 30: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 31: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 32: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 33: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 34: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 35: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 36: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 37: How would you describe Swift in three words?

Thou shalt initialise all properties of your type!Thou shalt not call super init before properties are initialised!

Thou shalt not call class methods until all properties are initialised!Thou shalt not use super properties before super.init!

Thou shalt only call designated initialisers on the superclass!Thou shalt not call super initialisers from convenience initialisers!

Thou shalt not call class methods before super.init !Thou shalt not kill

Page 38: How would you describe Swift in three words?

class Cat: Animal { ... init(name: String, isLongHaired: Bool) { // initialize *all* class properties // no calls to 'self' methods here super.init(name: name) // perform initialisation that requires self & super // possibly update superclass properties } convenience init() { // can only call designated initializers on self self.init(name: "kitty", isLongHaired: false) } }

Page 39: How would you describe Swift in three words?
Page 40: How would you describe Swift in three words?

Strictness bites

Page 41: How would you describe Swift in three words?

import Foundation !class Animal { let name: String init(name: String) { self.name = name.capitalizedString } } !class Cat: Animal { let catName: String override init(name: String) { super.init(name: name) ! // error: property 'self.catName' not // initialized at super.init call self.catName = self.name + "-kins" } }

Page 42: How would you describe Swift in three words?

Solution - make catName surprised!

class Cat: Animal { let catName: String! override init(name: String) { super.init(name: name) self.catName = self.name + "-kins" } }

Page 43: How would you describe Swift in three words?

Spot the semicolon!

Page 44: How would you describe Swift in three words?

Swift is a bit muddled up!

Page 45: How would you describe Swift in three words?

!class Cat { ... init(name: String) { ... } func updateWithName(name: String, isLongHaired: Bool) { ... } } !func updateTheCatsName(cat: Cat, newName: String, isLongHaired: Bool) { ... } !!// initializers - named parameters let cat = Cat(name: "molly") !// global functions - no named parameters updateTheCatsName(cat, "frank", true) !// methods - second and subsequent parameters are named cat.updateWithName("frank", isLongHaired: true); !

Page 46: How would you describe Swift in three words?

!class Cat { ... init(_ name: String) { ... } func updateWithName(#name: String, isLongHaired: Bool) { ... } } !func updateTheCatsName(meow cat: Cat, newName: String, isLongHaired: Bool) { ... } !!// initializers let cat = Cat("molly") !// global functions updateTheCatsName(meow: cat, "frank", true) !// methods cat.updateWithName(name: "frank", isLongHaired: true)

Page 47: How would you describe Swift in three words?

Delegation patternclass ViewController: UIViewController, UITableViewDelegate { ! ... ! func tableView(tableView: UITableView!, didDeselectRowAtIndexPath indexPath: NSIndexPath!) { } func tableView(tableView: UITableView!, didEndDisplayingFooterView view: UIView!, forSection section: Int) { } ! func tableView(tableView: UITableView!, canPerformAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath!, withSender sender: AnyObject!) -> Bool { } }

Page 48: How would you describe Swift in three words?

Method naming

tableView:canPerformAction:forRowAtIndexPath:withSender:

tableView(_:canPerformAction:forRowAtIndexPath:withSender:)

Page 49: How would you describe Swift in three words?

Swift likes immutability!

Page 50: How would you describe Swift in three words?

Immutability - C#

const

readonly

ReadOnlyCollection

ArrayList

Page 51: How would you describe Swift in three words?

Immutability - Objective-C

const

#define

NSArray

NSMutableArray

Page 52: How would you describe Swift in three words?

Immutability is a first-class concept in Swift

var is a variable, it can be re-assigned

let is a constant, it cannot be re-assigned

Page 53: How would you describe Swift in three words?

Constants are everywhere

for i in 0...5 { // error i = 27 } !!!func square(number: Double) { // error number = number * number }

Page 54: How would you describe Swift in three words?

Mutability in practice

Page 55: How would you describe Swift in three words?

A variable class

class Coordinate { var x: Int = 0, y: Int = 0 } !var coord = Coordinate() coord.x = 56 !coord = Coordinate() coord.y = 57;

Class variable, you can change properties and re-assign

Page 56: How would you describe Swift in three words?

A constant class (almost)

class Coordinate { var x: Int = 0, y: Int = 0 } !let coord = Coordinate() coord.x = 56 !// fails here coord = Coordinate() coord.y = 57

A constant class can be mutated

A constant class cannot be re-assigned

Page 57: How would you describe Swift in three words?

A variable struct

struct Coordinate { var x: Int = 0, y: Int = 0 } !var coord = Coordinate() coord.x = 56 !coord = Coordinate() coord.y = 57

Variable struct, you can change properties and re-assign

Just like variable classes!

Page 58: How would you describe Swift in three words?

Constant structs are immutable :-)

struct Coordinate { var x: Int = 0, y: Int = 0 } !let coord = Coordinate() // error: fails here coord.x = 56 !coord = Coordinate() coord.y = 57 !

Constant struct, you cannot mutate it!

This is super-awesome, by changing a keyword, you change the mutability of the entire object.

Page 59: How would you describe Swift in three words?

Strings, Arrays and Dictionaries are structs

// a variable array var coord = [1,2,3,4] !// can be mutated! coord[1] = 5 // “[1, 4, 3, 4]”

// a constant array let coord = [1,2,3,4] !// error: ’@lvalue $T5' is not identical to 'Int' coord[1] = 5;

Page 60: How would you describe Swift in three words?

Creating Immutable Types

struct Coordinate { var x = 0, y = 0 func transpose() { let temp = x // error: cannot assign to ‘x’ in ‘self’ x = y y = temp } }

Page 61: How would you describe Swift in three words?

Mutating Functions

struct Coordinate { var x = 0, y = 0 mutating func transpose() { let temp = x // no error! x = y y = temp } }

Page 62: How would you describe Swift in three words?

Mutating Functions

// a variable coordinate var coord = Coordinate() coord.transpose() !!!// a constant coordinate let constCoord = Coordinate() !// error: immutable value of type ‘Coordinate' // only has mutating members named 'transpose' constCoord.transpose()

Page 63: How would you describe Swift in three words?

Structs are value-types

func trimArrayToLength<T>(array: [T], length: Int) { while array.count > length { // error: immutable value of type '[T]' only // has mutating members named 'removeLast' array.removeLast() } }

Page 64: How would you describe Swift in three words?

Structs are value-types

func trimArrayToLength<T>(inout array: [T], length: Int) { while array.count > length { array.removeLast() } } !var myArray = [1,3,5,3,8,9] trimArrayToLength(&myArray, 3) println(myArray) // [1,3,5]

Page 65: How would you describe Swift in three words?

Whenever you start typing var, type let instead, only changing it back to var if it does not compile!

Page 66: How would you describe Swift in three words?

Swift is Functional

Page 67: How would you describe Swift in three words?

First-class functionsimport Foundation !func square(number: Double) -> Double { return number * number } !let a = 3.0, b = 4.0 let c = sqrt(square(a) + square(b)) println(c) // 5.0

Page 68: How would you describe Swift in three words?

import Foundation !func square(number: Double) -> Double { return number * number } !let operation = square !let a = 3.0, b = 4.0 let c = sqrt(operation(a) + operation(b)) println(c) // 5.0

Page 69: How would you describe Swift in three words?

Function types

let operation = square

The type of operation is being inferred

But what *is* the type?

Page 70: How would you describe Swift in three words?

Function types

let operation:(Double) -> Double = square

Page 71: How would you describe Swift in three words?

Functions can be:

Assigned to variables or constants

Passed to / from other functions

Page 72: How would you describe Swift in three words?

Fun with functionsfunc * (fn: () -> (), times: Int) { for _ in 0..<times { fn() } } !{ println("Swift rocks!") } * 3 !// Swift rocks! // Swift rocks! // Swift rocks!

http://ijoshsmith.com/2014/07/05/custom-threading-operator-in-swift/

Page 73: How would you describe Swift in three words?

More functional fun …

Page 74: How would you describe Swift in three words?

// non functional var evens = [Int]() for i in 1...10 { if i % 2 == 0 { evens += [i] } } !var evenSum = 0 for i in evens { evenSum += i }

// functional evenSum = Array(1...10) .filter { (number) in number % 2 == 0 } .reduce(0) { (total, number) in total + number }

the sum of all even numbers between 1 and 10

Page 75: How would you describe Swift in three words?

Partial applicationfunc createSplitter(separator:String) -> (String -> [String]) { func split(source:String) -> [String] { return source.componentsSeparatedByString(separator) } return split }

let data = "5,7;3,4;55,6" let commaSplitter = createSplitter(",") commaSplitter(data) !let semiColonSplitter = createSplitter(";") semiColonSplitter(data)

Page 76: How would you describe Swift in three words?

Curried functions

func createSplitter(separator:String)(source:String) -> [String] { return source.componentsSeparatedByString(separator) }

func createSplitter(separator:String) -> (String -> [String]) { func split(source:String) -> [String] { return source.componentsSeparatedByString(separator) } return split }

Page 77: How would you describe Swift in three words?

class Person { let name: String; init(name: String) { self.name = name } func greeting() { println("Hello \(name)") } } !let speaker = Person(name: "Colin") speaker.greeting() // "Hello Colin" !let speakFunction = speaker.greeting speakFunction() // "Hello Colin" !let curriedFunc = Person.greeting curriedFunc(speaker)() // "Hello Colin"

Page 78: How would you describe Swift in three words?

Swift is concise

Page 79: How would you describe Swift in three words?

Sorting an array

let animals = ["fish", "cat" , "chicken", "dog"] !func isBefore(one: String, two:String) -> Bool { return one < two } !let sortedStrings = animals.sorted(isBefore) !println(sortedStrings) // [cat, chicken, dog, fish] !!

Page 80: How would you describe Swift in three words?

Closure expressions as anonymous functions

let sorted = animals.sorted({ (one: String, two: String) -> Bool in return one > two })

Page 81: How would you describe Swift in three words?

let sorted = animals.sorted({ (one: String, two: String) -> Bool in return one > two })

46 characters

Page 82: How would you describe Swift in three words?

let sorted = animals.sorted({ (one, two) -> Bool in return one > two })

32 characters

Page 83: How would you describe Swift in three words?

let sorted = animals.sorted({ (one, two) in return one > two })

26 characters

Page 84: How would you describe Swift in three words?

let sorted = animals.sorted({ one, two in return one > two })

24 characters

Page 85: How would you describe Swift in three words?

let sorted = animals.sorted({ one, two in one > two })

19 characters

Page 86: How would you describe Swift in three words?

50% smaller

let sorted = animals.sorted({ one, two in one > two })

let sorted = animals.sorted({ (one: String, two: String) -> Bool in return one > two })

Page 87: How would you describe Swift in three words?

let sorted = animals.sorted({ $0 > $1 })

7 characters

Page 88: How would you describe Swift in three words?

let sorted = animals.sorted() { $0 > $1 }

7 characters

Page 89: How would you describe Swift in three words?

let sorted = animals.sorted { $0 > $1 }

7 characters

Page 90: How would you describe Swift in three words?

let sorted = animals.sorted(>)

1 character!

Page 91: How would you describe Swift in three words?

Swift is clear

Page 92: How would you describe Swift in three words?

Swift still uses ARC

Page 93: How would you describe Swift in three words?

Swift still has retain cycles

Page 94: How would you describe Swift in three words?

Objective-C syntax

__weak typeof(self)weakSelf = self; [self.context performBlock:^{ __strong typeof(weakSelf)strongSelf = weakSelf; // do something with strongSelf }];

Page 95: How would you describe Swift in three words?

Swift syntax

closure = { [unowned self] () -> () in // do something with self }

Page 96: How would you describe Swift in three words?

Swift is ‘open’

Page 97: How would you describe Swift in three words?

for-in and sequenceclass Fibonacci: SequenceType { func generate() -> GeneratorOf<Int> { var current = 0, next = 1 return GeneratorOf<Int> { var ret = current current = next next = next + ret return ret } } } !for num in Fibonacci() { println(num) // 0, 1, 1, 2, 3, 5, 8, 13 } !

http://www.scottlogic.com/blog/2014/06/26/swift-sequences.html

Page 98: How would you describe Swift in three words?

Literal conversionclass Person: StringLiteralConvertible { let name: String required init(name: String) { self.name = name } class func convertFromStringLiteral(value: StringLiteralType) -> Self { return self(name: value) } class func convertFromExtendedGraphemeClusterLiteral(value: String) -> Self { return self(name: value) } } !var people: [Person] = ["Bob", "Frank", "Brian"]

Page 99: How would you describe Swift in three words?

How would you describe Swift in three words?

Page 100: How would you describe Swift in three words?

Safe

Page 101: How would you describe Swift in three words?

Swift hates nil Swift initialisation is really strict Swift likes immutable types

Page 102: How would you describe Swift in three words?

Muddled

Page 103: How would you describe Swift in three words?

Swift parameter naming is muddled up Swift variables are often dazed! or confused?

Page 104: How would you describe Swift in three words?

Modern

Page 105: How would you describe Swift in three words?

Swift is functional

Swift likes sugar

Swift is clear and concise

Page 106: How would you describe Swift in three words?

SwiftSafeMuddledModern

Page 107: How would you describe Swift in three words?

Swift wish-list

Some form of reflection

Exceptions (try / catch / throw)

A re-write of Foundation, UIKit, CoreData …