Swift高阶函数(map,filter和reduce)
2017-01-23 本文已影响82人
HunterDude
// SequenceTestVC.swift
// SwiftErrorHandlingAndGenerics
//
// Created by Hunter on 23/01/2017.
// Copyright © 2017 Hunter. All rights reserved.
//
import UIKit
class SequenceTestVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// MARK: - 闭包
func square(a:Float) -> Float {
return a * a
}
func cube(a:Float) -> Float {
return a * a * a
}
// 普通做法:
func averageSumOfSquares(a:Float,b:Float) -> Float {
return (square(a: a) + square(a: b)) / 2.0
}
func averageSumOfCubes(a:Float,b:Float) -> Float {
return (cube(a: a) + cube(a: b)) / 2.0
}
// 函数作为参数做法:
@discardableResult
func averageSumOfFunction(a: Float, b: Float,f:((Float) ->Float))-> Float {
return (f(a) + f(b)) / 2
}
// 实现
print(averageSumOfFunction(a: 4, b: 4, f: square))
print(averageSumOfFunction(a: 4, b: 4, f: cube))
print(averageSumOfFunction(a: 3, b: 3, f: {(x: Float) -> Float in return x * x}))
// 忽略指定参数名,使用默认参数名$0(如果函数接收多个参数,使用$K作为第K-1个参数,如$0,$1,$2......)
print(averageSumOfFunction(a: 3, b: 3, f: { $0 * $0 * $0}))
print("-----------------------------------------------------------------")
// MARK: - Array
/*
Swift的标准数组支持三个高阶函数:map,filter和reduce。Objective-C的NSArray没有实现这些方法
*/
// MARK: map
/*
map: 即转换
转换原数组元素并由此得到一个新数组
*/
let moneyArr: [Int] = [1,22,33,100,1000,1000000000,100000000000000]
print(moneyArr)
let stringArr: [String] = moneyArr.map({"\($0)?"})
print(stringArr)
print(moneyArr.map({ (money) in "\(money)?" }))
// MARK: Filter
/*
filter: 即赛选
赛选数组中符合条件的元素
*/
print(moneyArr.filter { (money) -> Bool in return 20 < money && money < 10000 })
print(moneyArr.filter({20 < $0 && $0 < 10000}))
// MARK: Reduce
/*
reduce: 把数组元素组合计算为一个值
*/
/*
reduce(initial: U, combine: (U, T) -> U) -> U
接收两个参数,一个为类型U的初始值,另一个为把类型为U的元素和类型为T的元素组合成一个类型为U的值的函数。
最终结果整个数组就变成了一个类型为U的值
*/
print(moneyArr.reduce(0, {$0 + $1}))
print(moneyArr.reduce(0, +))
// 遍历
let name = "uraimo"
(1...4).forEach{print("Happy Birthday " + (($0 == 3) ? "dear \(name)":""))}
}
}