Swift Language
Swift Advance-functies
Zoeken…
Invoering
Geavanceerde functies zoals map
, flatMap
, filter
en reduce
worden gebruikt om op verschillende soorten collecties te werken, zoals Array en Dictionary. Voorafgaande functies vereisen doorgaans weinig code en kunnen aan elkaar worden gekoppeld om complexe logica op een beknopte manier op te bouwen.
Introductie met geavanceerde functies
Laten we een scenario nemen om de geavanceerde functie beter te begrijpen,
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]
Kaart functie:
Gebruik map om over een verzameling te lussen en dezelfde bewerking op elk element in de verzameling toe te passen. De kaartfunctie retourneert een array met de resultaten van het toepassen van een toewijzings- of transformatiefunctie op elk item.
//Fetch all the user's name from array
let arrUserName = arrUser.map({ $0.name }) // ["John", "Chan", "Morgan", "Rachel", "Katie", "David", "Bob"]
Flat-Map-functie:
Het eenvoudigste gebruik is zoals de naam al doet vermoeden om een verzameling collecties af te vlakken.
// Fetch all user country name & ignore nil value.
let arrCountry = arrUser.flatMap({ $0.country }) // ["USA", "UK", "USA", "USA"]
Filter functie:
Gebruik filter om een collectie te herhalen en een array terug te geven die alleen die elementen bevat die overeenkomen met een include-voorwaarde.
// 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"]
Verminderen:
Gebruik verkleinen om alle items in een verzameling te combineren om één nieuwe waarde te creëren.
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
Multidimensionale reeks afvlakken
Om multidimensionale array in één dimensie samen te vatten, worden de geavanceerde functies van flatMap gebruikt. Een ander gebruik is het negeren van nulwaarde uit matrix- en toewijzingswaarden. Laten we eens kijken met een voorbeeld: -
Stel dat we een multidimensionale reeks steden hebben en we willen de lijst met stadnamen in oplopende volgorde sorteren. In dat geval kunnen we de flatMap-functie gebruiken zoals: -
let arrStateName = [["Alaska", "Iowa", "Missouri", "New Mexico"], ["New York", "Texas", "Washington", "Maryland"], ["New Jersey", "Virginia", "Florida", "Colorado"]]
Een eendimensionale lijst opstellen vanuit een multidimensionale array,
let arrFlatStateList = arrStateName.flatMap({ $0 }) // ["Alaska", "Iowa", "Missouri", "New Mexico", "New York", "Texas", "Washington", "Maryland", "New Jersey", "Virginia", "Florida", "Colorado"]
Voor het sorteren van arraywaarden kunnen we de kettingbewerking gebruiken of de flatten-array sorteren. Hieronder een voorbeeld dat de werking van de ketting toont,
// 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"]