Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

45
SWIFT A WHIRLWIND TOUR OF

Transcript of Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

Page 1: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

S W I F TA W H I R LW I N D T O U R O F

Page 2: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

I N T R O D U C T I O NM I A A L E X I O U

Page 3: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

I N T R O D U C T I O N

Mia AlexiouSubsymbolic Software Ltd

[email protected]

Page 4: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

T H E L A N G U A G ES W I F T

Page 5: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

H E L L O W O R L D

• Comments

• Import Statment

• Optional semi-colons

• Constants versus variables

/* * A basic Hello World swift application */ import Foundation

// Constants and variables let hello = "Hello" var name = "Tech Meetup"

// Printing and strings println("\(hello) \(name)") println("Today's date is: " + NSDate().description);

Page 6: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

I M M U TA B I L I T Y

// fine var title = "Tech Meetup" title = "Tech Meetup Edinburgh"

// not fine let greeting = "Hello" greeting = "Hi"

Page 7: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

S T R O N G T Y P I N G

// Inferred Type let hello = "Hello" var name = "Tech Meetup"

// Specified Type let colour: String = "green" var age: Int age = 35

• Strongly typed

• Types may be inferred

Page 8: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

F U N C T I O N S : S I M P L E C A S E

// Create the function func printHello() { print("Hello") }

// Run it printHello()

Page 9: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

F U N C T I O N S : PA R A M S A N D R E T U R N T Y P E S

func dayAfterDate(date: NSDate) -> NSDate { let calendar = NSCalendar.currentCalendar() return calendar.dateByAddingUnit(.CalendarUnitDay, value: 1, toDate: date, options: nil)! }

let tomorrow = dayAfterDate(NSDate())

Page 10: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

F U N C T I O N S : VA R I A B L E PA R A M S

func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum }

sumOf() sumOf(42, 597, 12)

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID158

Page 11: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

F U N C T I O N S : PA R A M N A M E S

// Param names not required func calculateArea(width: Double, height: Double) -> Double { return width * height } let area = calculateArea(10, 15)

// Param names required func calculateArea(#width: Double, #height: Double) -> Double { return width * height } let area = calculateArea(width: 10, height: 15)

Page 12: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

T U P L E S

let (x,y) = (10, 15) println(x) // prints 10 println(y) // prints 15

let position = (10, 15) println(position) // prints (10, 15) println(position.0) // prints 10

• Quickly group multiple variables

• Could instead define a struct, class, use existing CGPoint

Page 13: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

T U P L E S

// Blocking operation. Do not use on main thread func downloadImageFromUrl(imageUrl: NSURL) -> (image: UIImage?, error: NSError?){ let request = NSURLRequest(URL: imageUrl) var error: NSError? var image: UIImage? let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: &error) if let responseData = data { image = UIImage(data: responseData) } return (image, error) }

• Particularly useful when you want multiple return types

• Beware of overuse

Page 14: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

O P T I O N A L S

• Swift clearly distinguishes between variables which are required and those which are optional

• An optional MAY or MAY NOT contain another variable

• Clean contract for variables and return types

• Removes uncertainty around whether a variable could be nil / null

Page 15: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

O P T I O N A L S

// Blocking operation. Do not use on main thread func downloadImageFromUrl(imageUrl: NSURL) -> (image: UIImage?, error: NSError?) { let request = NSURLRequest(URL:imageUrl) var error: NSError? var image: UIImage? let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: &error) if let responseData = data { image = UIImage(data: responseData) } return (image, error) }

• Let’s revisit our previous function…

Page 16: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

O P T I O N A L S

var url = NSURL(string: "http://techmeetup.co.uk/static/img/techmeetup_logo.png")!

let download = downloadImageFromUrl(url) if let image = download.image { //do something with image }

if let error = download.error { NSLog("Could not download image: \(error.description)") }

• Invoking the previous function

Page 17: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

O P T I O N A L C H A I N I N G & D O W N C A S T I N G

if let postcode = clientForOrder("ABC834239")?.address?.postcode { marketingRegions.registerPostcode(postcode) }

if let address = jsonRecord["address"] as? NSDictionary, postcode = address["zipcode"] as? String { marketingRegions.registerPostcode(postcode) }

Page 18: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L O S U R E S

• Self contained blocks of functionality that can be passed around

• Capture and store references to any constants and variables from the context in which they are defined.

Page 19: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L O S U R E S

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] func backwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed = sorted(names, backwards)

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] var reversed = sorted(names, {(s1: String, s2: String) -> Bool in return s1 > s2 }

Page 20: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L O S U R E S

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] var reversed = sorted(names, { s1, s2 in return s1 > s2 } )

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] var reversed = sorted(names, { s1, s2 in s1 > s2 } )

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] var reversed = sorted(names, { $0 > $1 } )

Page 21: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

S T R U C T S

• Define properties to store values

• Define methods to provide functionality

• Define subscripts to provide access to their values using subscript syntax

• Define initializers to set up their initial state

• Be extended to expand their functionality beyond a default implementation

• Conform to protocols to provide standard functionality of a certain kind

From https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82

Page 22: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

S T R U C T S

struct Point { var x: Double var y: Double }

// Memberwise initialiser let point = Point(x: 5.0, y: 10.0)

Page 23: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

S T R U C T S

struct Point { var x = 0.0 var y = 0.0 }

// Default initialiser now available too let centre = Point()

// Memberwise initialiser let anotherPoint = Point(x: 5.0, y: 10.0)

Page 24: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

M E T H O D S

struct Point { var x = 0.0 var y = 0.0 func distanceFromOrigin() -> Double { return sqrt( pow(x,2.0) + pow(y,2.0) ) } }

let point = Point(x: 5.0, y: 10.0) println(point.distanceFromOrigin())

Page 25: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C O M P U T E D P R O P E R T I E S

struct Point { var x = 0.0 var y = 0.0 var distanceFromOrigin: Double { return sqrt( pow(x,2.0) + pow(y,2.0) ) } }

let point = Point(x: 5.0, y: 10.0) println(point.distanceFromOrigin)

Page 26: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L A S S E S

• No header / implementation separation

• Convention to put a class in its own file but not necessary

Page 27: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L A S S E S : D I F F E R E N T T O S T R U C T S

• Inheritance enables one class to inherit the characteristics of another.

• Type casting enables you to check and interpret the type of a class instance at runtime.

• Deinitializers enable an instance of a class to free up any resources it has assigned.

• Reference counting allows more than one reference to a class instance.

From https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82

Page 28: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L A S S E S : S I M P L E C A S E

class Person { var name: String? }

var person = Person() person.name = "Jon"

Page 29: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L A S S C O N T R A C T

class Customer {

let givenName: String let surname: String var dob: NSDate? private(set) var loyaltyScore = 0 private var creditStatus: CreditStatus? // what kind of init do we need?

}

Page 30: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L A S S C O N T R A C T

class Customer { let givenName: String let surname: String var dob: NSDate? private(set) var loyaltyScore = 0 init(givenName: String, surname: String) { self.givenName = givenName self.surname = surname } // and so on... }

Page 31: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

C L A S S C O N T R A C T

var customer = Customer(givenName: "Jon", surname: "Snow")

println(customer.loyaltyScore)

customer.loyaltyScore = 100 // not allowed

customer.dob = NSDate()

Page 32: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

P R O P E R T Y O B S E R V E R S

class Customer { let givenName: String let surname: String var dob: NSDate? { didSet { updateAge() } } // do more stuff }

Page 33: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

L A Z Y S T O R E D P R O P E R T I E S

class DataManager { lazy var importer = DataImporter() var data = [String]() // and so on... }

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254

Page 34: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

S U B C L A S S

class Trike: Vehicle { override func numberOfWheels() -> Int { return 3 } }

• No automatic base class

• Single inheritance

• Final keyword on class to block subclassing or method overriding

Page 35: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

P R O T O C O L Sprotocol Creature { var name: String { get } var dailyEnergyConsumption: Int { get set} }

class Dog: Creature { let name: String var dailyEnergyConsumption: Int = 1000 init(name: String) { self.name = name } }

let bango = Dog(name: "banjo") bango.dailyEnergyConsumption = 975

Page 36: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

E X T E N S I O N S

• Add methods or computed properties to a type

• Allows programmer to add behaviour to an object that they did not instantiate

• Can mutate self

• Conform to a new protocol

• Can NOT override existing methods or add stored properties

Page 37: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

extension NSTimeInterval { var hh: Int { let secInHour = 60.0 * 60.0 return (Int)(self / secInHour) } }

let hoursWorked = getTimeWorked().hh

E X T E N S I O N S

Page 38: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

T H E AT T I C

Page 39: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

T H E AT T I C

• Topics for next time:

• Collections, enums, control flow, generics

• Memory management

• Testing, Testing, Testing

Page 40: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

F I N I S H I N G T H O U G H T S

Page 41: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

PA I N P O I N T S

• Pain points of the past are fixed

• A few outstanding

• no code coverage reporting

• compiler seg faults

• core data / test namespacing

Page 42: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

F I N I S H I N G T H O U G H T S

• Existing devs: Switch now

• New devs: Try it now

Page 43: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

W H E R E T O N E X T ?

• Apple: WWDC Videos https://developer.apple.com/videos/wwdc

• Apple: Swift Resourceshttps://developer.apple.com/swift/resources/

• Apple: Swift Programming Guidehttps://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/

• Stanford: Developing iOS 8 Apps with Swifthttps://itunes.apple.com/gb/course/developing-ios-8-apps-swift/id961180099

• Ray Wenderlich Tutorials http://www.raywenderlich.com/

Page 44: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

T H A N K Y O U !Q U E S T I O N S C O M M E N T S ?

Page 45: Swift · Title: Swift.key Created Date: 5/14/2015 11:18:42 PM

S TAY I N T O U C H

Mia AlexiouSubsymbolic Software Ltd

[email protected]