三元运算符问题 SwiftUI

Posted

技术标签:

【中文标题】三元运算符问题 SwiftUI【英文标题】:Ternary operator issue SwiftUI 【发布时间】:2020-04-12 09:25:10 【问题描述】:

我在我的 swiftui 视图中使用三元运算符来更改项目的前景色。 当使用它作为代码时,一切编译正常:

Circle()
     .frame(width: 10, height: 10)
     .foregroundColor(item.amount < 10 ? Color.green : Color.red)

使用它时,我的项目无法构建,我的 Mac 的 CPU 开始飙升,风扇启动等等。有人知道出了什么问题吗?

Circle()
     .frame(width: 10, height: 10)
     .foregroundColor(item.amount < 10 ? Color.green : (item.amount < 100 ? Color.orange : Color.red))

完整代码:

struct ContentView: View 

    @ObservedObject var expenses = Expenses()
    @State private var showAddExpense = false

    var body: some View 
        NavigationView 
            List 
                ForEach (expenses.items)  item in
                    HStack 
                        VStack(alignment: .leading) 
                            Text(item.name)
                                .font(.headline)
                            Text(item.type)
                        
                        Spacer()
                        Text("€\(item.amount)")
                        Circle()
                            .frame(width: 10, height: 10)
                            .foregroundColor(item.amount < 10 ? Color.green : (item.amount < 100 ? Color.orange : Color.red))
                    
                
                .onDelete(perform: removeItem)

            
            .navigationBarTitle("iExpense")
            .navigationBarItems(leading: EditButton(), trailing:
                Button(action: 
                    self.showAddExpense = true
                
                ) 
                    Image(systemName: "plus")
            )
        
        .sheet(isPresented: $showAddExpense) 
            AddView(expenses: self.expenses)
        

    
    func removeItem(at index: IndexSet) 
        expenses.items.remove(atOffsets: index)
    

工作表修饰符上显示错误,但这个是正确的。

【问题讨论】:

【参考方案1】:

为较小的组件打破车身结构,如下所示

ForEach (expenses.items)  item in
    self.listRow(for: item)  // << extract !!

.onDelete(perform: removeItem)

,比如说,私有行生成器函数

private func listRow(for item: Item) -> some View  // << your item type here
    HStack 
        VStack(alignment: .leading) 
            Text(item.name)
                .font(.headline)
            Text(item.type)
        
        Spacer()
        Text("€\(item.amount)")
        Circle()
            .frame(width: 10, height: 10)
            .foregroundColor(item.amount < 10 ? Color.green : (item.amount < 100 ? Color.orange : Color.red))
    

【讨论】:

谢谢,这行得通。为什么刹车时它会编译? @BjornMorrhaye:Swift 类型推断总是有其粗糙的边缘:spin.atomicobject.com/2016/04/26/swift-long-compile-time 我明白了 :) 感谢您的帮助!

以上是关于三元运算符问题 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

视图主体中的 swiftui 三元运算符

Swift:SwiftUI 视图的多个条件的内联评估

React useState:如何将三元运算符放在三元运算符中?

JavaScript 速记三元运算符

为啥不能重载三元运算符?

Yaml 中的三元运算符