Swift Language
Programmazione funzionale in Swift
Ricerca…
Estrarre un elenco di nomi da un elenco di Person (s)
Dato una struct Person
struct Person {
let name: String
let birthYear: Int?
}
e una schiera di Person(s)
let persons = [
Person(name: "Walter White", birthYear: 1959),
Person(name: "Jesse Pinkman", birthYear: 1984),
Person(name: "Skyler White", birthYear: 1970),
Person(name: "Saul Goodman", birthYear: nil)
]
possiamo recuperare un array di String
contenente la proprietà name
di ogni Person.
let names = persons.map { $0.name }
// ["Walter White", "Jesse Pinkman", "Skyler White", "Saul Goodman"]
attraversamento
let numbers = [3, 1, 4, 1, 5]
// non-functional
for (index, element) in numbers.enumerate() {
print(index, element)
}
// functional
numbers.enumerate().map { (index, element) in
print((index, element))
}
Proiezione
L'applicazione di una funzione a una raccolta / flusso e la creazione di una nuova raccolta / flusso è detta proiezione .
/// Projection
var newReleases = [
[
"id": 70111470,
"title": "Die Hard",
"boxart": "http://cdn-0.nflximg.com/images/2891/DieHard.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": [4.0],
"bookmark": []
],
[
"id": 654356453,
"title": "Bad Boys",
"boxart": "http://cdn-0.nflximg.com/images/2891/BadBoys.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": [5.0],
"bookmark": [[ "id": 432534, "time": 65876586 ]]
],
[
"id": 65432445,
"title": "The Chamber",
"boxart": "http://cdn-0.nflximg.com/images/2891/TheChamber.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": [4.0],
"bookmark": []
],
[
"id": 675465,
"title": "Fracture",
"boxart": "http://cdn-0.nflximg.com/images/2891/Fracture.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": [5.0],
"bookmark": [[ "id": 432534, "time": 65876586 ]]
]
]
var videoAndTitlePairs = [[String: AnyObject]]()
newReleases.map { e in
videoAndTitlePairs.append(["id": e["id"] as! Int, "title": e["title"] as! String])
}
print(videoAndTitlePairs)
filtraggio
Crea un flusso selezionando gli elementi da un flusso che passa una determinata condizione è chiamato filtro
var newReleases = [
[
"id": 70111470,
"title": "Die Hard",
"boxart": "http://cdn-0.nflximg.com/images/2891/DieHard.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 4.0,
"bookmark": []
],
[
"id": 654356453,
"title": "Bad Boys",
"boxart": "http://cdn-0.nflximg.com/images/2891/BadBoys.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 5.0,
"bookmark": [[ "id": 432534, "time": 65876586 ]]
],
[
"id": 65432445,
"title": "The Chamber",
"boxart": "http://cdn-0.nflximg.com/images/2891/TheChamber.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 4.0,
"bookmark": []
],
[
"id": 675465,
"title": "Fracture",
"boxart": "http://cdn-0.nflximg.com/images/2891/Fracture.jpg",
"uri": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 5.0,
"bookmark": [[ "id": 432534, "time": 65876586 ]]
]
]
var videos1 = [[String: AnyObject]]()
/**
* Filtering using map
*/
newReleases.map { e in
if e["rating"] as! Float == 5.0 {
videos1.append(["id": e["id"] as! Int, "title": e["title"] as! String])
}
}
print(videos1)
var videos2 = [[String: AnyObject]]()
/**
* Filtering using filter and chaining
*/
newReleases
.filter{ e in
e["rating"] as! Float == 5.0
}
.map { e in
videos2.append(["id": e["id"] as! Int, "title": e["title"] as! String])
}
print(videos2)
Usare il filtro con le strutture
Spesso è possibile filtrare strutture e altri tipi di dati complessi. La ricerca di una serie di strutture per voci che contengono un particolare valore è un'attività molto comune e facilmente ottenibile in Swift utilizzando le funzionalità di programmazione funzionale. Inoltre, il codice è estremamente succinto.
struct Painter {
enum Type { case Impressionist, Expressionist, Surrealist, Abstract, Pop }
var firstName: String
var lastName: String
var type: Type
}
let painters = [
Painter(firstName: "Claude", lastName: "Monet", type: .Impressionist),
Painter(firstName: "Edgar", lastName: "Degas", type: .Impressionist),
Painter(firstName: "Egon", lastName: "Schiele", type: .Expressionist),
Painter(firstName: "George", lastName: "Grosz", type: .Expressionist),
Painter(firstName: "Mark", lastName: "Rothko", type: .Abstract),
Painter(firstName: "Jackson", lastName: "Pollock", type: .Abstract),
Painter(firstName: "Pablo", lastName: "Picasso", type: .Surrealist),
Painter(firstName: "Andy", lastName: "Warhol", type: .Pop)
]
// list the expressionists
dump(painters.filter({$0.type == .Expressionist}))
// count the expressionists
dump(painters.filter({$0.type == .Expressionist}).count)
// prints "2"
// combine filter and map for more complex operations, for example listing all
// non-impressionist and non-expressionists by surname
dump(painters.filter({$0.type != .Impressionist && $0.type != .Expressionist})
.map({$0.lastName}).joinWithSeparator(", "))
// prints "Rothko, Pollock, Picasso, Warhol"
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow