如果没有颜色名称则不显示颜色 (SwiftUI)

Do not display a color if there is no color name (SwiftUI)

我从 Model() 中获取图片的框架颜色名称,我从 colorSet 中获取颜色

struct Model: Identifiable {
    
    let id = UUID()
    let image: String
    let colorSet: String

}

extension Model {
    
    static func AllModel() -> [Model] {
        
        return [
            //1
            Model(image: "folder", colorSet: "YELLOW"),
            //2
            Model(image: "folder.fill",  colorSet: "")
            
        ]
        
    }
}

但是如果 colorSet 没有颜色名称因为不需要它,我会得到一个错误

如何实现如果颜色名称不在 colorSet 中,则不显示任何内容

完整代码

struct Model: Identifiable {
    
    let id = UUID()
    let image: String
    let colorSet: String

}

extension Model {
    
    static func AllModel() -> [Model] {
        
        return [
            //1
            Model(image: "folder", colorSet: "YELLOW"),
            //2
            Model(image: "folder.fill",  colorSet: "")
            
        ]
        
    }
}


struct Im: View {
    
    let model = Model.AllModel()
    
    var body: some View {
        HStack {
        ForEach(model) { model in

           CellView(model: model)
        }
        
        }
    }
}


struct CellView: View {

    
    let model: Model
    
    var body: some View {

        Image(systemName: model.image)
            .resizable()
            .scaledToFit()
            .frame(width: 40, height: 40)
            .padding()
            .overlay(RoundedRectangle(cornerRadius: 9)
            .stroke(Color(model.colorSet), lineWidth: 5))

    }

    
}

明确一点:

extension Model {
    
    static func AllModel() -> [Model] {
        return [
            //1
            Model(image: "folder", colorSet: "YELLOW"),
            //2
            Model(image: "folder.fill",  colorSet: "CLEAR")
        ]
    }
}

像这样设置“CLEAR”颜色集:

结果,你会得到这个:

编辑:

由于您还在图标下方显示了颜色的名称,因此您需要做的就是使用三元组查看是否 colorSet == "CLEAR" 然后用空字符串替换它,如下所示:

struct CellView: View {
    let model: Model
    
    var body: some View {
        VStack {
        Image(systemName: model.image)
            .resizable()
            .scaledToFit()
            .frame(width: 40, height: 40)
            .padding()
            .overlay(RoundedRectangle(cornerRadius: 9)
            .stroke(Color(model.colorSet), lineWidth: 5))
            // Put a ternary in the Text() to test whether you have "CLEAR"
            Text(model.colorSet == "CLEAR" ? "" : model.colorSet)
        }
    }
}

我会让你的模型更丰富,让你的视图更简单

struct Model: Identifiable {
    let id = UUID()
    let image: String
    let colorSet: String?  // optional named color
}

extension Model {
    static func AllModel() -> [Model] {
        return [
            //1
            Model(image: "folder", colorSet: "YELLOW"),
            //2
            Model(image: "folder.fill",  colorSet: nil)
        ]
    }

    // Computed property for the color
    var borderColor: Color {
        guard let colorSet = colorSet else {
            return .clear
        }

        return Color(colorSet)
    }

    // and e.g. for a name for showing in the UI
    var uiName: String {
        guard let colorSet = colorSet else {
            return "None"
        }

        return colorSet
    }
}

那么你的观点就变成了

struct CellView: View {
    let model: Model

    var body: some View {
        Image(systemName: model.image)
            .resizable()
            .scaledToFit()
            .frame(width: 40, height: 40)
            .padding()
            .overlay(
                RoundedRectangle(cornerRadius: 9)
                    .stroke(model.borderColor, lineWidth: 5)
                )
    }
}

与文本类似,名称的格式设置为在模型中显示,而不是在视图中显示。