Top Banner
Programação funcional em Swift
29

Programação funcional em Swift

Apr 15, 2017

Download

Software

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: Programação funcional em Swift

Programação funcional em Swift

Page 2: Programação funcional em Swift

Mas… O que é Programação

funcional?

Page 3: Programação funcional em Swift

"Programação funcional é um paradigma de programação que visa tratar a computação como avaliação de funções matemáticas…" - Wikipedia (tradução livre)

Page 4: Programação funcional em Swift

Para programarmos usando esse paradigma então temos de :

- tratar funções como equações matemáticas…

- evitar mudança de estado…

- evitar dados mutáveis…

- programação funcional não deve ter efeitos colaterais... ou seja não alteram o mundo a sua volta...

Page 5: Programação funcional em Swift
Page 6: Programação funcional em Swift

Nos queremos somar o array no total…

var total = 0

let array = [0,1,2,3,4,5,6,7,8,9,10]

func add(){ for item in array{ total = total + item } }

add() //total = 55

Page 7: Programação funcional em Swift

Quando temos de usar essa função mais de uma vez o q ela faz? add() //total = 55 add() //total = 110 add() //total = 165

Page 8: Programação funcional em Swift

O problema é que estamos alterando um

estado global…

Page 9: Programação funcional em Swift

Como seria uma forma funcional de fazer isso?

func addfunctional(array:[Int]) ->Int { // uma forma reduzida é // return array.reduce(0,combine: +)

return array.reduce(0){ total , number in total + number} }

Page 10: Programação funcional em Swift

Usando varias vezes vc tem sempre o mesmo resultado, quando a entrada é a mesma…

addfunctional(array) \\55 addfunctional(array) \\55 addfunctional(array) \\55

Page 11: Programação funcional em Swift
Page 12: Programação funcional em Swift

Map, Filter, Reduce…. O que são?

Page 13: Programação funcional em Swift

Map

Page 14: Programação funcional em Swift

Map é indicado quando vc precisa transformar um array… ele mapeia uma coleção e faz alguma coisa…

let array = [0,1,2,3,4,5,6,7,8,9,10]

let stringarray = array.map{ "\($0)" } //[“0”,”1”,"2","3","4","5","6","7","8","9","10"]

Page 15: Programação funcional em Swift

Podemos usar funções também…

func square(x:Int) -> Int{ return x * x } let tot = array.map(square) //[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Page 16: Programação funcional em Swift

Filter

Page 17: Programação funcional em Swift

O filter filtra um array retornando um novo array com os elementos que passam no teste.

let filterarray = array.filter{$0 > 5} //filterarray = [6, 7, 8, 9, 10]

Page 18: Programação funcional em Swift

podemos usar também funções que retornam bool…

func passaAlto(x:Int) -> Bool{ return x > 5 }

let filterarray2 = array.filter(passaAlto) //filterarray2 = [6, 7, 8, 9, 10]

Page 19: Programação funcional em Swift

Reduce

Page 20: Programação funcional em Swift

O reduce parte de um principio que é modificado a cada passo do array. Ele retorna o resultado da passagem por todos os elementos.

let arrayreduce = array.reduce(0, combine: +)

//55

Page 21: Programação funcional em Swift

É possível também usar da seguinte forma, para usar funções no lugar de operadores…

let arrayreduce2 = array.reduce(0){ (total, number) in total + square(number) } //385

Page 22: Programação funcional em Swift

Podemos usa-los juntos!!

Page 23: Programação funcional em Swift

let filterarray = array.filter{$0 > 5} //filterarray = [6, 7, 8, 9, 10]

let filterarray = array.filter{$0 > 5}.map(square) //filterarray = [36, 49, 64, 81, 100]

let filterarray = array.filter {$0 > 5}.map(square).reduce(0, combine: +) //filterarray = 330

Page 24: Programação funcional em Swift

Praticamente todos os tipos são tipos de variáveis.

Classes são excessão…

Page 25: Programação funcional em Swift

Um enum pode ser usado como varivel e testado em um switch…

enum Result { case Success(AnyObject) case Failure(NSError) }

func dividir(x:Int, y:Int) -> Result{ if y<1 { return Result.Failure(NSError(domain: "divide0", code: 1, userInfo: nil)) } return Result.Success(x / y) }

Page 26: Programação funcional em Swift

let result = dividir(1000, y: 2)

switch result { case .Success(let mystuff):

let march = mystuff as! Int + 10 // 510

case .Failure(let error): error }

Page 27: Programação funcional em Swift

Curried functions…

Page 28: Programação funcional em Swift

Como isso funciona?? não sei, mas funciona assim XD

func add(x: Int) ->Int ->Int { return {y in return x + y} }

let sum = add(2) // Int -> Int

let boom = sum(4) // 6

let things = add(10)(12) // 22

Page 29: Programação funcional em Swift

ObrigadoVinicius Lima

@vnmontanhavn [email protected]