Swift Language
Swift Advance-funktioner
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"]