【问题标题】:How can I break up my code so Xcode will let my run my App | SwiftUI如何分解我的代码,以便 Xcode 让我运行我的应用程序 | SwiftUI
【发布时间】:2022-01-03 14:00:26
【问题描述】:

我收到此错误

编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式

发生错误的代码是这样的:

ForEach(items){ item in
                    var abgektItem = abgehakt.first(where: {i in i.id == item.id})
                    var normalItem = abgektItem.normalItem
                    var normalItemAnzahl = normalItemAnzahl ?? 0
                    var anzhal = item.normalItem!.Anzahl - normalItemAnzahl
                    someView(anzhal)
                }.padding(.vertical)

我简化了代码。 我该如何分解代码?我的意思是我每一步都需要一个新的变量......

感谢您的帮助,Boothosh

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    这通常意味着你有一个错误,而不是表达式实际上太复杂了。例如,这些行是不正确的:

    var abgektItem = abgehakt.first(where: {i in i.id == item.id})
    var normalItem = abgektItem.normalItem
    

    first(where:) 返回一个 Optional,因此 abgektItem.normalItem 无效。有时确定不正确的代码肯定是不正确的(即,没有方式可以通过类型提升或强制或某些协议扩展使其工作)是组合爆炸性的,这就是导致这种情况的原因消息而不是正确的错误。

    通常调试这个的最好方法(通常是为了更易读的代码)是将计算转移到一个函数:

    ForEach(items) { item in computeView(item) }
    

    其中computeView 是一个局部函数,类似于:

    func computeView(_ item: Item) -> some View {
        // compute
        return someView(anzhal)
    }
    

    如果您将此代码移至新的computeView 函数,编译器几乎肯定会很快找到您的错误。

    【讨论】:

    • 天哪,我发现这个错误太愚蠢了......(我只是在你的解决方案中发现它,将视图移动到一个函数中)。你拯救了我的一天,谢谢!
    【解决方案2】:

    我已经收到了这条消息,当您在视图中放置太多逻辑时,在您的 viewModel 中进行检查等,它会很好

    【讨论】:

    • 这已经是他们对原因的理解了。他们在问如何来简化逻辑。至于将逻辑移动到视图模型,你能澄清你的意思吗?如果您建议这样做只是为了获得更多有意义的编译器错误,这就是@Rob’s answer from several hours ago 的建议,但要更加清晰和详细。如果您建议简单地移动它会解决问题,那么基于Rob’s accepted answer,情况似乎并非如此。
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多