programação funcional em swift
TRANSCRIPT
![Page 1: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/1.jpg)
Programação funcional em Swift
![Page 2: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/2.jpg)
Mas… O que é Programação
funcional?
![Page 3: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/3.jpg)
"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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/5.jpg)
![Page 6: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/8.jpg)
O problema é que estamos alterando um
estado global…
![Page 9: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/11.jpg)
![Page 12: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/12.jpg)
Map, Filter, Reduce…. O que são?
![Page 13: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/13.jpg)
Map
![Page 14: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/16.jpg)
Filter
![Page 17: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/19.jpg)
Reduce
![Page 20: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/21.jpg)
É 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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/22.jpg)
Podemos usa-los juntos!!
![Page 23: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/24.jpg)
Praticamente todos os tipos são tipos de variáveis.
Classes são excessão…
![Page 25: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/27.jpg)
Curried functions…
![Page 28: Programação funcional em Swift](https://reader034.vdocuments.pub/reader034/viewer/2022042611/58f235161a28abde578b45c7/html5/thumbnails/28.jpg)
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