Sök…


Introduktion

Avanceringsfunktioner som map , flatMap , filter och reduce används för att driva olika samlingstyper som Array och Dictionary. Avanceringsfunktioner kräver vanligtvis lite kod och kan kedjas ihop för att bygga upp komplex logik på ett kortfattat sätt.

Introduktion med förhandsfunktioner

Låt oss ta ett scenario för att förstå förhandsfunktionen på ett bättre sätt,

struct User {
    var name: String
    var age: Int
    var country: String?
}

//User's information 
let user1 = User(name: "John", age: 24, country: "USA")
let user2 = User(name: "Chan", age: 20, country: nil)
let user3 = User(name: "Morgan", age: 30, country: nil)
let user4 = User(name: "Rachel", age: 20, country: "UK")
let user5 = User(name: "Katie", age: 23, country: "USA")
let user6 = User(name: "David", age: 35, country: "USA")
let user7 = User(name: "Bob",age: 22, country: nil)

//User's array list
let arrUser = [user1, user2, user3, user4, user5, user6, user7]

Kartfunktion:

Använd kartan för att slinga över en samling och tillämpa samma operation på varje element i samlingen. Kartfunktionen returnerar en matris som innehåller resultaten av att tillämpa en mappnings- eller transformeringsfunktion på varje objekt.

//Fetch all the user's name from array 
let arrUserName = arrUser.map({ $0.name }) // ["John", "Chan", "Morgan", "Rachel", "Katie", "David", "Bob"]

Plattkartafunktion:

Den enklaste användningen är som namnet antyder för att platta en samling samlingar.

// Fetch all user country name & ignore nil value.
let arrCountry = arrUser.flatMap({ $0.country }) // ["USA", "UK", "USA", "USA"]

Filterfunktion:

Använd filter för att slinga över en samling och returnera en array som endast innehåller de element som matchar ett inkluderande villkor.

// Filtering USA user from the array user list.
let arrUSAUsers = arrUser.filter({ $0.country == "USA" }) // [user1, user5, user6]

// User chaining methods to fetch user's name who live in USA 
let arrUserList = arrUser.filter({ $0.country == "USA" }).map({ $0.name }) // ["John", "Katie", "David"]

Minska:

Använd reducera för att kombinera alla objekt i en samling för att skapa ett enda nytt värde.

Swift 2.3: -

//Fetch user's total age.
let arrUserAge = arrUser.map({ $0.age }).reduce(0, combine: { $0 + $1 }) //174

//Prepare all user name string with seperated by comma 
let strUserName = arrUserName.reduce("", combine: { $0 == "" ? $1 : $0 + ", " + $1 }) // John, Chan, Morgan, Rachel, Katie, David, Bob

Swift 3: -

//Fetch user's total age.
let arrUserAge = arrUser.map({ $0.age }).reduce(0, { $0 + $1 }) //174

//Prepare all user name string with seperated by comma 
let strUserName = arrUserName.reduce("", { $0 == "" ? $1 : $0 + ", " + $1 }) // John, Chan, Morgan, Rachel, Katie, David, Bob

Platta flerdimensionell matris

För att platta flerdimensionell matris till en enda dimension används flatMap-förhandsfunktioner. Ett annat användningsfall är att försumma nollvärde från array- och kartläggningsvärden. Låt oss kolla med exempel: -

Anta att vi har ett flerdimensionellt antal städer och vi vill sortera listor över stadsnamn i stigande ordning. I så fall kan vi använda flatMap-funktion som: -

let arrStateName = [["Alaska", "Iowa", "Missouri", "New Mexico"], ["New York", "Texas", "Washington", "Maryland"], ["New Jersey", "Virginia", "Florida", "Colorado"]]

Förbereda en enda dimensionell lista från flerdimensionell matris,

let arrFlatStateList = arrStateName.flatMap({ $0 }) // ["Alaska", "Iowa", "Missouri", "New Mexico", "New York", "Texas", "Washington", "Maryland", "New Jersey", "Virginia", "Florida", "Colorado"]

För sortering av matrisvärden kan vi använda kedjefunktioner eller sortera plattmatris. Här nedan exempel som visar kedjefunktion,

// Swift 2.3 syntax 
let arrSortedStateList = arrStateName.flatMap({ $0 }).sort(<) // ["Alaska",     "Colorado", "Florida", "Iowa", "Maryland", "Missouri", "New Jersey", "New Mexico", "New York", "Texas", "Virginia", "Washington"]

// Swift 3 syntax
let arrSortedStateList = arrStateName.flatMap({ $0 }).sorted(by: <) // ["Alaska", "Colorado", "Florida", "Iowa", "Maryland", "Missouri", "New Jersey", "New Mexico", "New York", "Texas", "Virginia", "Washington"]


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow