首页 > 解决方案 > Swift 5 - 枚举内的枚举

问题描述

我正在尝试使用枚举对项目进行分类。因此,我最终在枚举中使用了枚举。而且我不完全确定整个枚举是如何工作的。

但我想要做的是利用枚举 MaterialClassification,然后如果有第二个枚举,例如粘土,则利用该枚举的值将其作为字符串返回。

enum MaterialClassification {
    
    case clay(value: Clay)
    case flux//(value: Fluxs)
    case glassFormer
    case stain//(value: Clay)
    case accessoryMaterial
    
    case all//(value: Clay)
}

extension MaterialClassification {
    var materiaIdentifier: String {
        switch self {
        case .clay:
            return "clay"
        case .flux:
            return "flux"
        case .glassFormer:
            return "glassFormer"
        case .stain:
            return "stain"
        case .accessoryMaterial:
            return "accessoryMaterial"
        case .all:
            return "all"
        }
    }
}
enum Clay {
    
    case iskaolin// = "Kaolin"
    case isPrimaryKaolin// = "Primary Kaolin"
    case isSecondaryKaolin //= "Secondary Kaolin"
    case isBallClay //= "Ball Clay"
    case isStoneware// = "Stoneware"
    case isFireClay //= "Fire Clay"
    case isEarthenware// = "Earthenware"
    case isVolcanicClay// = "Volcanic"
}

extension Clay {
    
    var clayType: String {
        switch self {
        case .iskaolin:
            return "Kaolin"
        case .isPrimaryKaolin:
            return "Primary Kaolin"
        case .isSecondaryKaolin:
            return "Secondary Kaolin"
        case .isBallClay:
            return "Ball Clay"
        case .isStoneware:
            return "Stoneware"
        case .isFireClay:
            return "Fire Clay"
        case .isEarthenware:
            return "Earthenware"
        case .isVolcanicClay:
            return "Volcanic Clay"
        }
    }
}

我的目标是能够在需要时返回嵌套字符串。例如:

materialClassification: MaterialClassification.clay(type: Clay.isPrimaryKaolin)

我需要一种方法来返回“初级高岭土”。但我不知道如何连接 2 个枚举。

标签: iosswiftdata-structuresenums

解决方案


如果我正确理解您的问题,您希望访问关联类型的属性。您可以将新属性添加到您的MaterialClassification枚举并使用它来访问您的案例。

像这样的东西应该工作

var type: String? {
    
    switch self {
    case .clay(let clay):
        return clay.clayType
    case .flux(let flux):
        return flux.fluxType
    case .stain(let stain):
        return stain.stainType
    case .glassFormer, .accessoryMaterial, .all:
        return nil
    }
}

推荐阅读