swift_高阶函数

2023-05-09  本文已影响0人  李永开

一. reduce

高阶函数reduce有两个声明

@inlinable public func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
@inlinable public func reduce<Result>(into initialResult: Result, _ updateAccumulatingResult: (inout Result, Element) throws -> ()) rethrows -> Result
做个测试:
  1. 报错Cannot use mutating member on immutable value: 'partialResult' is a 'let' constant, partialResult是个let变量,不能进行append
        let ctrlTypes = [HomeViewController.self,
                         OtherViewController.self]
        let ctrls = ctrlTypes.reduce([]) { partialResult, type in
            let nav = BaseNavigationController(rootViewController: type.init())
            return partialResult.append(nav)
        }
  1. 使用inout则没有问题
        let ctrlTypes = [HomeViewController.self,
                         OtherViewController.self]
        let ctrls = ctrlTypes.reduce(into: [UIViewController]()) { partialResult, type in
            let nav = BaseNavigationController(rootViewController: type.init())
            return partialResult.append(nav)
        }
        let intArr = [1, 2, 3]
        //结果为6, 没有问题
        let ret0 = intArr.reduce(0) { partialResult, num in
            partialResult + num
        }
        let ret1 = intArr.reduce(into: 0) { partialResult, num in
            partialResult + num  //结果为0,因为初始值0是引用传递,系统并不会将相加的值再赋值给partialResult
            partialResult += num// 结果为6,正确
        }
总结:
  1. 两个声明的本质是值传递和引用传递(inout)的区别
  2. 两个声明的闭包内部实现不一致。针对值传递,会将闭包的出参给下一个闭包的入参; 针对引用传递,系统并不会帮我们做这些,需要我们自己实现

二.

上一篇 下一篇

猜你喜欢

热点阅读