从 switch case 语句转换为 Swift 中的值

Convert from switch case statement to a value in Swift

也许这是个愚蠢的问题

我有一个这样的 switch case 语句:

        self.text = type.rawValue
        switch type {
        case .teuro:
            self.backgroundColor =  UIColor.sapphireColor()
        case .lesson:
            self.backgroundColor = UIColor.orangeColor()
        case .profession:
            self.backgroundColor = UIColor.pinkyPurpleColor()
        }

有没有什么办法可以写成这样的例子:

        self.backgroundColor = {
            switch type {
            case .teuro:
                return  UIColor.sapphireColor()
            case .lesson:
                return  UIColor.orangeColor()
            case .profession:
                return UIColor.pinkyPurpleColor()
            }
        }

欢迎任何评论或回答。谢谢

最好在枚举中创建一种颜色变量。

示例如下

enum Type {
    case type1, type2
    
    var color: UIColor {
        switch self {
        case .type1:
            return .black
            
        case .type2:
            return .yellow
        }
    }
}

使用

class ViewController: UIViewController {
    let type: Type = .type1
    
    override func viewDidLoad() {
        self.view.backgroundColor = type.color
    }
}

你快到了!

您创建了一个 returns 颜色的闭包,并将其分配给 UIColor 属性,但闭包不是颜色!

你只需要调用(调用)闭包给运行它,这样它returns你想要的颜色:

self.backgroundColor = {
    switch type {
    case .teuro:
        return  UIColor.sapphireColor()
    case .lesson:
        return  UIColor.orangeColor()
    case .profession:
        return UIColor.pinkyPurpleColor()
    }
}() // <---- notice the brackets!

通常你不想混合你的模型和你的 UI,只需要在一个视图中使用这种颜色

这就是我最终创建此类扩展的原因,这些扩展只能在视图的当前文件中访问:

private extension Type {
    var backgroundColor: UIColor {
        switch self {
        case .teuro:
            return .sapphireColor()
        case .lesson:
            return .orangeColor()
        case .profession:
            return .pinkyPurpleColor()
        }
    }
}

Sweeper 完全正确,您可以通过在末尾添加缺少的 () 来使用闭包对其进行初始化。这就是您问题的字面答案。

但 Philip 也是正确的,最好为您的枚举类型添加一个扩展以定义颜色和您的案例之间的映射。它从两个调用点抽象出配色方案(例如,确保您在整个应用程序中应用一致的颜色,同时从不重复自己),但同时避免将 UI 配色方案与一些基本的配色方案纠缠在一起枚举类型。

但我想更进一步,即将此观察扩展到 text 属性。您不应在 UI 中使用 rawValue 字符串。原始代码(如果你有的话)不应该与你想在 UI 中显示的字符串混为一谈。一个是编码问题,另一个是 UI 问题。

所以,我不仅要将 color 移动到扩展名中,还要移动显示文本,例如我会定义一个 text 属性:

extension MyEnumerationType {
    var text: String { rawValue }
}

那么你可以这样做:

self.text = myEnumerationInstance.text

现在我仍然使用 rawValue,但我将它从 UI 中抽象出来。原因是您可能希望最终支持不同的字符串,但不更改 rawValue 代码。例如,您可能希望在某个时候支持本地化:

extension MyEnumerationType {
    var text: String { NSLocalizedString(rawValue, comment: "MyEnumerationType") }
}

或者您可能在这个 text 计算 属性 中有一个 switch 语句。但它避免了枚举的内部表示(rawValue)与 UI.

的紧密耦合

所以,最重要的是,您不仅应该从类型本身抽象出配色方案,还应该抽象显示文本。这样,您可以在将来的某个日期更改显示文本,但不会破坏依赖于旧 rawValue 值的代码。