iOS中能否创建具备特殊运算特性的null CGPath?
关于CGPath等效CGRect.null的实现问题
CGRect.null的便捷特性
CGRect有个非常实用的内置常量CGRect.null,它的特性刚好适配集合操作的初始值需求:
let aRect = ... //从某处获取矩形 CGRect.null.union(aRect) //结果为aRect CGRect.null.intersection(aRect) //结果为CGRect.null
简单说,用它做并集操作的初始值时,最终结果就是所有目标矩形的并集;做交集初始值时,结果始终是自身,很适合用在reduce这类批量运算里。
CGPath的现有问题
但CGPath并没有提供类似的内置常量,这就导致我们没法直接用reduce批量计算路径并集:
let bunchOfPaths = [...] //CGPath数组 let unionPath = bunchOfPaths.reduce(CGPath.null, { $0.union($1) }) //这段代码无法运行,因为不存在CGPath.null
我尝试了几种替代方案,但都达不到预期:
方案1:用CGRect.null生成路径
以为用CGRect.null创建路径就能等效,但实际测试不符合要求:
let nullRectPath = CGPath(rect: .null, transform: nil) nullRectPath.isEmpty //false (?!) let zeroRectPath = CGPath(rect: .zero, transform: nil) nullRectPath.union(zeroRectPath) == zeroRectPath //false
用CGRect.null生成的路径并不处于空状态,和零矩形路径的并集结果也不是目标路径。
方案2:创建空路径
尝试通过路径相减得到空路径,同样不满足需求:
let emptyPath = zeroRectPath.subtracting(zeroRectPath) emptyPath.isEmpty //true emptyPath.union(zeroRectPath) == zeroRectPath //false (!!)
虽然这个路径标记为“空”,但和其他路径执行并集操作后,结果并不是目标路径。
核心疑问
是否存在这样的CGPath:
- 和任意CGPath执行并集操作,结果等于该CGPath
- 和任意CGPath执行交集操作,结果等于自身
如果存在,该如何创建?
内容的提问来源于stack exchange,提问作者executor21
相关产品推荐
相关产品推荐

