Ошибка компилятора Xcode: компилятору не удается ввести-проверить это выражение в разумные сроки (Xcode 12.0 SwiftUI)

#ios #swift #swiftui

#iOS #swift #swiftui

Вопрос:

(Xcode 12.0, SwiftUI) Этот код работал у меня почти 6 месяцев без каких-либо проблем, я только вчера получил эту ошибку без какого-либо редактирования. Я много пытался очистить код и сделать его короче, но у меня ничего не получалось.

 GeometryReader { (geometry: GeometryProxy) in

  ForEach(0..<5) { index in

    Group {

      Circle()
        .foregroundColor(Color("GreyOne"))
        .frame(width: geometry.size.width / 5, height: geometry.size.height / 5)

        .scaleEffect(!self.isAnimating ? 1 - CGFloat(index) / 5 : 0.2   CGFloat(index) / 5)

        .offset(y: geometry.size.width / 10 - geometry.size.height / 2)

      }.frame(width: geometry.size.width, height: geometry.size.height)

        .rotationEffect(!self.isAnimating ? .degrees(0) : .degrees(360))

        .animation(Animation
            
            .timingCurve(0.5, 0.15   Double(index) / 5, 0.25, 1, duration: 1.5)

          .repeatForever(autoreverses: false))

    }

}.aspectRatio(1, contentMode: .fit)

    .onAppear {

      self.isAnimating = true

    }
  

Ответ №1:

Вы можете переместить части вашего View в отдельные частные функции и просто вызвать их из body . В вашем коде было несколько ошибок компилятора, например, не переход x к offset функции или не преобразование всех Int s в CGFloat . Как только вы разобьете body свой View , появятся реальные ошибки.

Вот скомпилированная версия вашего кода, использующая 2 частные функции для сборки частей body вашего View .

 struct YourView: View {
    @State private var isAnimating = false

    var body: some View {
        GeometryReader { geometry in
            ForEach(0..<5) { index in
                Group {
                    circle(geometry: geometry, index: index)
                }
                .frame(width: geometry.size.width, height: geometry.size.height)
                .rotationEffect(!self.isAnimating ? .degrees(0) : .degrees(360))
                .animation(animation(index: index))
            }
        }
        .aspectRatio(1, contentMode: .fit)
        .onAppear {
            self.isAnimating = true
        }
    }

    private func animation(index: Int) -> Animation {
        Animation
            .timingCurve(0.5, 0.15   Double(index) / 5, 0.25, 1, duration: 1.5)
            .repeatForever(autoreverses: false)
    }

    private func circle(geometry: GeometryProxy, index: Int) -> some View {
        let width = geometry.size.width
        let height = geometry.size.height
        let yOffset = width / 10 - height / 2
        let nonAnimatingScale = 1 - CGFloat(index) / CGFloat(5)
        let animatingScale = 0.2   CGFloat(index) / CGFloat(5)
        return Circle()
            .foregroundColor(Color("GreyOne"))
            .frame(width: width / 5, height: height / 5)
            .scaleEffect(self.isAnimating ? animatingScale : nonAnimatingScale)
            .offset(x: 0, y: yOffset)
    }
}