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

Swift大型结构体Equatable一致性:==运算符类型检查耗时优化

优化Swift大型结构体Equatable实现的类型检查速度

针对SwiftUI大型结构体Equatable实现中类型检查耗时过长的问题,可以通过以下几种方式优化:

1. 拆分表达式并分步判断

将长链式的&&判断拆分为多个逻辑分组,用变量保存每组的判断结果,并通过guard提前返回,减少编译器一次性处理的表达式复杂度:

public static func == (lhs: ScrollableGraphicForecastView, rhs: ScrollableGraphicForecastView) -> Bool {
    // 基础标识与配置属性
    let baseMatch = lhs.viewId == rhs.viewId
        && lhs.nowHash == rhs.nowHash
        && lhs.canScrollAndFitAll == rhs.canScrollAndFitAll
        && lhs.colorScheme == rhs.colorScheme
        && lhs.fineHorizontalSizeClass == rhs.fineHorizontalSizeClass
        && lhs.aspectRatio == rhs.aspectRatio
    
    guard baseMatch else { return false }
    
    // 渲染相关属性
    let renderMatch = lhs.forecast == rhs.forecast
        && lhs.renderContent == rhs.renderContent
        && lhs.renderContext == rhs.renderContext
        && lhs.renderOptions == rhs.renderOptions
        && lhs.renderData == rhs.renderData
        && lhs.daysOutlookSource == rhs.daysOutlookSource
        && lhs.dataSettable == rhs.dataSettable
    
    guard renderMatch else { return false }
    
    // 滚动相关属性
    let scrollMatch = lhs.scrollStep == rhs.scrollStep
        && lhs.scrollStepCount == rhs.scrollStepCount
        && lhs.absoluteScrollOffset == rhs.absoluteScrollOffset
        && lhs.containerSize == rhs.containerSize
        && lhs.chartSize == rhs.chartSize
        && lhs.midScreenAbsoluteScrollOffset == rhs.midScreenAbsoluteScrollOffset
    
    guard scrollMatch else { return false }
    
    // 缩放状态属性
    let scaleMatch = lhs.scaleInProgress == rhs.scaleInProgress
        && lhs.scaleAnchor == rhs.scaleAnchor
        && lhs.scale == rhs.scale
        && lhs.scaleCoefficient == rhs.scaleCoefficient
        && lhs.lastScaleValue == rhs.lastScaleValue
        && lhs.visibleChartStartRelative == rhs.visibleChartStartRelative
        && lhs.stagger == rhs.stagger
    
    return scaleMatch
}

2. 显式标注复杂判断的结果类型

对于涉及泛型或自定义复杂类型的属性判断,显式标注结果为Bool,减少编译器的类型推导工作量:

let forecastMatch: Bool = lhs.forecast == rhs.forecast
let renderContextMatch: Bool = lhs.renderContext == rhs.renderContext

3. 拆分大型结构体为子结构体

将大型结构体按职责拆分为多个小型子结构体,各自实现Equatable。主结构体的相等判断仅需调用子结构体的==运算符,大幅降低编译器的类型检查压力:

// 拆分渲染配置为子结构体
struct RenderConfiguration: Equatable {
    var forecast: ForecastType
    var renderContent: ContentType
    var renderContext: ContextType
    var renderOptions: OptionsType
    var renderData: DataType
    var daysOutlookSource: SourceType
    var dataSettable: SettableType
}

// 拆分滚动状态为子结构体
struct ScrollState: Equatable {
    var scrollStep: CGFloat
    var scrollStepCount: Int
    var absoluteScrollOffset: CGFloat
    var containerSize: CGSize
    var chartSize: CGSize
    var midScreenAbsoluteScrollOffset: CGFloat
}

// 拆分缩放状态为子结构体
struct ScaleState: Equatable {
    var scaleInProgress: Bool
    var scaleAnchor: UnitPoint
    var scale: CGFloat
    var scaleCoefficient: CGFloat
    var lastScaleValue: CGFloat
    var visibleChartStartRelative: CGFloat
    var stagger: Bool
}

// 主结构体
struct ScrollableGraphicForecastView: Equatable {
    var viewId: String
    var nowHash: String
    var canScrollAndFitAll: Bool
    var colorScheme: ColorScheme
    var fineHorizontalSizeClass: UserInterfaceSizeClass?
    var aspectRatio: CGFloat
    var renderConfig: RenderConfiguration
    var scrollState: ScrollState
    var scaleState: ScaleState
    
    public static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.viewId == rhs.viewId
            && lhs.nowHash == rhs.nowHash
            && lhs.canScrollAndFitAll == rhs.canScrollAndFitAll
            && lhs.colorScheme == rhs.colorScheme
            && lhs.fineHorizontalSizeClass == rhs.fineHorizontalSizeClass
            && lhs.aspectRatio == rhs.aspectRatio
            && lhs.renderConfig == rhs.renderConfig
            && lhs.scrollState == rhs.scrollState
            && lhs.scaleState == rhs.scaleState
    }
}

这种拆分不仅优化了编译速度,同时提升了代码的可维护性和可读性。

内容的提问来源于stack exchange,提问作者Tomáš Kafka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:04:54