Swift Language
Funktionell programmering i Swift
Sök…
Extrahera en lista med namn från en lista med person (er)
Får en Person
struktur
struct Person {
let name: String
let birthYear: Int?
}
och en grupp 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)
]
vi kan hämta en rad String
innehåller name
tillhör varje person.
let names = persons.map { $0.name }
// ["Walter White", "Jesse Pinkman", "Skyler White", "Saul Goodman"]
förflyttnings
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))
}
Utskjutande
Att tillämpa en funktion på en samling / ström och skapa en ny samling / ström kallas en projektion .
/// 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)
Filtrering
Skapa en ström genom att välja element från en ström som passerar ett visst villkor kallas filtrering
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)
Använda filter med strukturer
Ofta kanske du vill filtrera strukturer och andra komplexa datatyper. Att söka i en rad strukturer efter poster som innehåller ett visst värde är en mycket vanlig uppgift och lätt att uppnå i Swift med hjälp av funktionella programmeringsfunktioner. Dessutom är koden extremt kortfattad.
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow