iOS-swift

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)":""))}

    }

}
上一篇下一篇

猜你喜欢

热点阅读