《函数式swift》学习一

Posted iOS开发知识整理

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《函数式swift》学习一相关的知识,希望对你有一定的参考价值。

案例研究:封装Core Image

  • 这个案例是通过一个已经存在且面向对象的API,展示如何使用高阶函数将其以小巧且函数式的方式进行。


1.首先是定义一个闭包,并且重命名。该闭包接受一个CIImage并返回一个CIImage。

typealias Filter = (CIImage) -> CIImage

2.构建一个模糊滤镜

//模糊滤镜
    func blur(radius: Double) -> Filter{
        return { image in
            let parameters:[String: Any] = [
                kCIInputRadiusKey: radius,
                kCIInputImageKey:image
            ]
            
            guard let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters) else{
                fatalError("错误1")
            }
            
            guard let outputImage = filter.outputImage else{
                fatalError("错误二")
            }
            
            return outputImage
        }
    }

3.颜色叠层,颜色叠层在调用的时候会导致程序崩溃,这里应该有点儿问题,不过理解到里面的思想就行了。

//固定颜色滤镜
    func generate(color: UIColor) -> Filter{
        return { _ in
            
            let parameters = [
                kCIInputColorKey:CIColor(cgColor: color.cgColor)
            ]
            
            guard let filter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: parameters) else{
                fatalError(".....")
            }
            
            guard let outputImage = filter.outputImage else {
                fatalError("''''''''")
            }
            
            return outputImage
        }
    }

4.合成滤镜

//合成滤镜
    func compositeSourceOver(overlay: CIImage) -> Filter{
        return { image in
            let parameters = [
                kCIInputBackgroundImageKey:image,
                kCIInputImageKey:overlay
            ]
            
            guard let filter = CIFilter(name: "CISourceOverCompositing", withInputParameters: parameters) else{
                fatalError()
            }
            
            guard let outputImage = filter.outputImage else {
                fatalError()
            }
            
            
            return outputImage
        }
    }

5.再创建一个通过两个滤镜来创建颜色叠层滤镜。这里是用先前创建颜色生成滤镜generate(color:)来生成一个新叠层。然后以gennerate(color:)返回的CIImage作为compositeSourceOver(overlay:)参数调用该函数,返回Filter类型值。这里就很明显了任何滤镜之间可以相互组合,特别的灵活。

//滤镜颜色叠成
    func overlay(color:UIColor) -> Filter{
        return { image in
            let overlay = self.generate(color: color)(image).cropping(to: image.extent)
            return self.compositeSourceOver(overlay: overlay)(image)
        }
    }

6.所以我们可以创建一个将两个任意生成滤镜方法进行组合

//简化函数
    func compose(filter filter1:@escaping Filter, with filter2:@escaping Filter) -> Filter{
        return {image in filter2(filter1(image))}
    }

7.为了防代码更具有可读性,我们还可以再进行一步,为组合滤镜引入自定义运算符。

infix operator >>>
//自定义个运算符
func >>> (filter1:@escaping Filter,filter2:@escaping Filter) -> Filter{
    return {image in filter2(filter1(image))}
}

柯里化

-将一个接受多个参数的函数变换为一系列只接受单个参数的函数,这个过程被称为柯里化。这个列子add2称为add1的柯里化版本。

func add1(_ x: Int, _ y: Int) -> Int{
        return x + y
    }
    
func add2(_ x: Int) -> ((Int) -> Int){
        return {y in x + y}
    }


以上是关于《函数式swift》学习一的主要内容,如果未能解决你的问题,请参考以下文章

书籍推荐|函数式Swift

《函数式 Swift》出版

Swift 学习- 07 -- 函数

Swift 函数式编程实践

稀有动物,试驾铃木新一代Swift Sport

初学者应该先学什么:TDDSwift 还是函数式?