SwiftUI Switch 语句转换行为不符合预期

SwiftUI Switch Statement Transition Behavior is not as expected

与使用两个 if 语句相比,使用 switch 语句更新视图时出现意外 .transition 行为。两个 if 语句按预期将视图滑入和滑出,但是,switch 语句中的相同转换导致视图从一侧滑入并退出另一侧。

我希望使用 switch 语法使我的代码保持一致(关于我如何更新视图),但获得与 if 语句相称的行为。

这是一些示例代码,其中可以观察到表现出不同过渡行为的顶部矩形和底部矩形:

import SwiftUI

enum ExampleStep: Int {
    
    case stepOne
    case stepTwo
    
}

struct TransitionExample: View {
    
    @State var exampleStep:ExampleStep = .stepOne
    
    
    var body: some View {
        
        VStack {
            
            Button {
                
                withAnimation {
                    exampleStep = exampleStep == .stepOne ? .stepTwo : .stepOne
                }
            
            } label: {
                Text("Click Me")
            }
            
            Spacer()
            
            if exampleStep == .stepOne {
                
                Rectangle()
                    .foregroundColor(Color.green)
                    .frame(width: 100, height: 100)
                    .transition(.move(edge: .leading))

            }
            
            if exampleStep == .stepTwo {
                
                Rectangle()
                    .foregroundColor(Color.red)
                    .frame(width: 100, height: 100)
                    .transition(.move(edge: .trailing))
                
            }
            
            Spacer()
            
            switch exampleStep {
                
            case .stepOne:
                Rectangle()
                    .foregroundColor(Color.green)
                    .frame(width: 100, height: 100)
                    .transition(.move(edge: .leading))
                
            case .stepTwo:
                Rectangle()
                    .foregroundColor(Color.red)
                    .frame(width: 100, height: 100)
                    .transition(.move(edge: .trailing))
                
            
            
            }
            
            Spacer()
            
        }
        
    }
    
}

struct TransitionExample_Previews: PreviewProvider {
    static var previews: some View {
        TransitionExample()
    }
}

差异可能与 SwiftUI 结果生成器如何将 if 语句转换为 buildIfbuildEither 等以及 switch 语句的转换方式有关翻译。参见:https://jasonzurita.com/swiftui-if-statement/

如果您在 switch 语句中明确定义非对称转换,看起来您可以获得与 if 语句匹配的行为:

switch exampleStep {
    
case .stepOne:
    Rectangle()
        .foregroundColor(Color.green)
        .frame(width: 100, height: 100)
        .transition(.asymmetric(insertion: .move(edge: .leading), removal: .move(edge: .trailing)))
    
case .stepTwo:
    Rectangle()
        .foregroundColor(Color.red)
        .frame(width: 100, height: 100)
        .transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
    
}