29
Programação funcional em Swift

Programação funcional em Swift

Embed Size (px)

Citation preview

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]