map
1.map
方法的定義
public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
map函數(shù)接收一個閉包做參數(shù)轨蛤,閉包本身參數(shù)是原數(shù)組的元素祥山,閉包返回值是一個泛型,由泛型對象組成的數(shù)組作為map函數(shù)的返回值缝呕。
2.示例
-
返回與原數(shù)組相同的類型
let numbers = [0, 1, 2, 3, 4, 5]
let addNumbers = numbers.map { number in
return number + 1
}
// [1, 2, 3, 4, 5, 6]
print(addNumbers)
- 返回與原數(shù)組不同的類型
```
class Person: NSObject {
var name = ""
var age = 0
var height: Float = 0
}
let personDictArray = [["name": "zhangsan", "age": 21, "height": 185],
["name": "lisi", "age": 22, "height": 180],
["name": "lihua", "age": 11, "height": 120]]
let personArray = personDictArray.map { (dict) -> Person in
let person = Person()
if let name = dict["name"] as? String {
person.name = name
}
if let age = (dict["age"] as AnyObject).int32Value {
person.age = Int(age)
}
if let height = (dict["height"] as AnyObject).floatValue {
person.height = height
}
return person
}
3.注意
無論原數(shù)組是否存在可選類型的元素供常,map操作返回的結(jié)果數(shù)組元素都可以是可選類型的
let numbers: Array = [0, 1, 2, 3, 4, 5]
let optionalNumbers = numbers.map { number -> String? in
let killNumber = 1
if number == killNumber {
return nil
} else {
return "我是\(number),不是\(killNumber)"
}
}
// Optional("我是0,不是1"), nil, Optional("我是2,不是1"), Optional("我是3,不是1"), Optional("我是4,不是1"), Optional("我是5,不是1")
print(optionalNumbers)
flatMap
1.flatMap
方法的定義
- 重載1
public func flatMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
flatMap
函數(shù)重載1接收一個閉包做參數(shù)栈暇,閉包本身參數(shù)是原數(shù)組的元素,閉包返回值是一個泛型煎源,由非可選類型的泛型對象組成的數(shù)組作為flatMap函數(shù)的返回值。與map函數(shù)基本相同歇僧,不同之處在于返回的數(shù)組不存在可選類型的元素锋拖。
- 重載2
public func flatMap<SegmentOfResult : Sequence>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]
```flatMap```函數(shù)**重載2**接收一個閉包做參數(shù),閉包本身參數(shù)是原數(shù)組的元素侥钳,閉包返回值是一個泛型柄错,與**重載1**不同的是,```flatMap```返回泛型對象的元素組成的數(shù)組做為返回值冕房。
2.示例
-
重載1示例
let possibleNumbers = ["1", "2", "three", "http:///4///", "5"]
let mapped: [Int?] = numbers.map { str in Int(str) }
// [1, 2, nil, nil, 5]
let flatMapped: [Int] = numbers.flatMap { str in Int(str) }
// [1, 2, 5]
- 重載2示例
```
let originalNumbers = [1, 2, 3, 4]
let mapped1 = originalNumbers.map { Array(repeating: $0, count: $0) }
// [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
let flatMapped1 = originalNumbers.flatMap { Array(repeating: $0, count: $0) }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
filter
1.filter
方法的定義
public func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
filter
方法接收一個閉包做參數(shù)趁矾,閉包本身參數(shù)是原數(shù)組的元素,閉包返回布爾值毫捣,filter
方法的返回值由原數(shù)組元素同樣類型的元素組成蔓同,也就是閉包返回值為true
的元素。
2.示例
-
從一個字符串?dāng)?shù)組中找出所有長度小于5的元素
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.characters.count < 5 }
print(shortNames)
// Prints "["Kim", "Karl"]"
##Reduce
1.```Reduce```方法的定義
public func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
```Reduce``` 方法接收一個閉包做參數(shù)弃揽,閉包本身包含兩個參數(shù)则北,**參數(shù)1**是上一次執(zhí)行閉包操作的結(jié)果值,**參數(shù)2**是原數(shù)組的元素涌矢,閉包一個泛型對象快骗,```Reduce```方法的返回值就是最終的這個泛型對象塔次。
2.示例
- 計(jì)算一個整型數(shù)組的所有元素的和
```
let numbers1 = [1, 2, 3, 4]
let addTwo: (Int, Int) -> Int = { x, y in x + y }
let numberSum = numbers1.reduce(0, addTwo)
// 'numberSum' == 10
小練習(xí)
給定一些人俺叭,計(jì)算給所給出的這些人中年齡在15-22歲之間的平均身高泰偿。
let personDictArray = [["name": "zhangsan", "age": 25, "height": 185],
["name": "lisi", "age": 22, "height": 180],
["name": "lihua", "age": 21, "height": 170],
["name": "lihua", "age": 18, "height": 173],
["name": "lihua", "age": 19, "height": 177],
["name": "lihua", "age": 11, "height": 120]]
let filterPerson = personDictArray.map { (dict) -> Person in
let person = Person()
if let name = dict["name"] as? String {
person.name = name
}
if let age = (dict["age"] as AnyObject).int32Value {
person.age = Int(age)
}
if let height = (dict["height"] as AnyObject).floatValue {
person.height = height
}
return person
}.filter { person -> Bool in
return person.age >= 15 && person.age <= 22
}
let averageHeight = filterPerson.reduce(0) { (result, person) -> Float in
return result + person.height
} / Float(filterPerson.count)
print(averageHeight)