You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过修改运算符简化Swift中的addEdgesLimit函数?

Swift函数addEdgesLimit的简化方案

你提供的addEdgesLimit函数确实可以大幅简化,核心问题在于不同分支仅存在比较运算符的差异,我们可以通过抽离重复计算和封装枚举的比较逻辑来消除冗余代码。

简化步骤说明

  1. 提取重复计算的阈值:函数中多次出现(imageSize.width - cropSize.width) / 2和(imageSize.height - cropSize.height) / 2,提前计算这两个阈值,避免重复运算。
  2. 封装枚举的比较规则:给Corner枚举扩展属性,让每个case对应x、y方向的比较逻辑(<=或>=),消除分支里的重复判断代码。
  3. 统一处理限制逻辑:利用枚举的比较属性,一次性完成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:18:31