SwiftUI троичный условный баг? - PullRequest
0 голосов
/ 10 марта 2020

Я пытался использовать троичный оператор в SwiftUI, чтобы сделать некоторые модификаторы представления «Dynami c» на основе значения @State var, которое я объявил. Но, похоже, SwiftUI не полностью поддерживает этот оператор внутри модификаторов представления. Это ошибка? Что мне здесь не хватает?

struct Test: View {
    @State var selectedIdx: Int?
    var colors : [Color] = [.red, .orange, .yellow, .green, .blue]

    var body: some View {
        VStack {
            //some other views that change "selectedIdx" (the @State var)
            //...
            ForEach(0..<colors.count) { idx in
                Rectangle()
                    .frame(width: 70, height: 100)
                    //some other view modifiers that will be animated
                    .animation(Animation.easeInOut.delay(self. selectedIdx == nil ? 0.1*Double(self.colors.count - idx) : 0.1*Double(idx)))
            }
        }
    }
}

Ошибка исчезнет, ​​если я удалю троичный оператор. Я пробовал разные комбинации для троичного оператора, но ни одна из них не работает:

.animation(Animation.easeInOut.delay(0.1*Double(self.selectedIdx == nil ? self.colors.count - idx : idx)))

.animation(Animation.easeInOut.delay(self.selectedIdx == nil ? 0.1*Double(self.colors.count - idx) : Double(idx)))

И даже что-то простое, подобное следующему, не работает:

.animation(Animation.easeInOut.delay(self.selectedIdx == nil ? Double(idx) : Double(idx)))

Любые идеи о правильное использование тернарного оператора внутри модификаторов вида?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Xcode 11.3.1 был глючным. Теперь, когда я обновился до 11.4.1, он работает нормально.

0 голосов
/ 10 марта 2020

Не уверен, где проблема, но следующий тестовый код работает здесь. Протестировано с Xcode 11.2 / iOS 13.2.

demo

struct ContentView: View {
    @State private var selectedIdx: Int?
    var colors : [Color] = [.red, .orange, .yellow, .green, .blue]

    var body: some View {
        VStack {
            //some other views that change "selectedIdx" (the @State var)
            Button("Reset") { self.selectedIdx = nil }
            //...
            ForEach(0..<colors.count) { idx in
                self.row(index: idx)
                    //some other view modifiers that will be animated
                    .animation(Animation.easeInOut.delay(self.selectedIdx == nil ? 0.1*Double(self.colors.count - idx) : 0.1*Double(idx)))
                    .onTapGesture { self.selectedIdx = idx }
            }
        }
    }

    func row(index: Int) -> some View {
        Rectangle()
            .fill(self.selectedIdx == index ? self.colors[index] : Color.black)
            .frame(width: 70, height: 100)
    }
}
...