如何通过修改运算符简化Swift中的addEdgesLimit函数?
Swift函数addEdgesLimit的简化方案
你提供的addEdgesLimit函数确实可以大幅简化,核心问题在于不同分支仅存在比较运算符的差异,我们可以通过抽离重复计算和封装枚举的比较逻辑来消除冗余代码。
简化步骤说明
- 提取重复计算的阈值:函数中多次出现
(imageSize.width - cropSize.width) / 2和(imageSize.height - cropSize.height) / 2,提前计算这两个阈值,避免重复运算。 - 封装枚举的比较规则:给
Corner枚举扩展属性,让每个case对应x、y方向的比较逻辑(<=或>=),消除分支里的重复判断代码。 - 统一处理限制逻辑:利用枚举的比较属性,一次性完成x、y方向的限制判断,去掉冗余的switch分支结构。
简化后的完整代码
// 给Corner枚举扩展比较逻辑属性 extension Corner { var xComparison: (CGFloat, CGFloat) -> Bool { switch self { case .topLeft, .bottomLeft: return (<=) case .topRight: return (>=) // 新增Corner case时,补充对应的比较规则即可 } } var yComparison: (CGFloat, CGFloat) -> Bool { switch self { case .topLeft, .topRight: return (<=) case .bottomLeft: return (>=) // 新增Corner case时,补充对应的比较规则即可 } } } func addEdgesLimit(corner: Corner, xOffset: CGFloat, yOffset: CGFloat, magnification: CGSize, imageSize: CGSize, cropSize: CGSize) -> CGSize { var magni = magnification // 提前计算阈值,避免重复计算 let xThreshold = (imageSize.width - cropSize.width) / 2 let yThreshold = (imageSize.height - cropSize.height) / 2 // 根据Corner的规则处理x方向限制 if corner.xComparison(xOffset, xThreshold) { magni.width = 1 } // 根据Corner的规则处理y方向限制 if corner.yComparison(yOffset, yThreshold) { magni.height = 1 } return magni }
可选的替代写法(更直观的布尔标识)
如果偏好更直白的逻辑表达,可以用布尔属性替代运算符闭包:
extension Corner { var shouldLimitXWithLessThanOrEqual: Bool { switch self { case .topLeft, .bottomLeft: return true case .topRight: return false } } var shouldLimitYWithLessThanOrEqual: Bool { switch self { case .topLeft, .topRight: return true case .bottomLeft: return false } } } func addEdgesLimit(corner: Corner, xOffset: CGFloat, yOffset: CGFloat, magnification: CGSize, imageSize: CGSize, cropSize: CGSize) -> CGSize { var magni = magnification let xThreshold = (imageSize.width - cropSize.width) / 2 let yThreshold = (imageSize.height - cropSize.height) / 2 if corner.shouldLimitXWithLessThanOrEqual ? xOffset <= xThreshold : xOffset >= xThreshold { magni.width = 1 } if corner.shouldLimitYWithLessThanOrEqual ? yOffset <= yThreshold : yOffset >= yThreshold { magni.height = 1 } return magni }
两种写法都能大幅减少代码冗余,同时保持逻辑清晰,后续新增Corner的case时,仅需在枚举扩展中补充对应规则,无需修改函数核心逻辑。
内容的提问来源于stack exchange,提问作者AdR
相关产品推荐
相关产品推荐

