Optional Tuple 和 Function
Nov 25, 2018
见到 optional 的东西时我都会有种莫名的舒爽,因为我可以用 map
或者 flatMap
将它作为参数传给某个函数,并将结果又以同样的方式传递给下一个函数:
1 | let newImage = imageThatIsOptional |
但偶尔我们会碰到一些拥有多个参数的函数,比如说 crop(_ image: UIImage, with rect: CGRect)
,这时链式调用就尴尬了。
曾几何时,我们是可以把 tuple 直接作为多参数函数的参数的,那个时候我们可以写成:
1 | let tuple = (image, .zero) |
后来 Swift 取消了这个功能,我们不能再直接将 tuple 作为参数了。但是,我们依然能够通过 map
的方式,将一个 optional 的 tuple 作为参数传给函数。
1 | let tuple: (UIImage, CGRect)? = (image, CGRect.zero) |
很棒吧,但我们还需要解决一个问题,那就是怎么优雅地创建这个 tuple。John Sundell 给我们推荐了一个方法——再给 Optional
加个 flatMap
。
1 | extension Optional { |
当然我们也可以从方法下手,用 swift-overture 这种东西把 crop
变成只需要一个参数的方法。