Swift 枚举嵌套 class VS Kotlin 密封 class。听不懂

Swift enum nested class VS Kotlin sealed class. Cant understand

我在 Swift 中有代码。

enum QuestionnaireViewMode {
    
    case add(input: Add)
    case edit(input: Edit)
    
    enum Add {
        
        case building(input: BuildingInput)
        case car(input: CarInput)
        case park
        
        struct BuildingInput {
            let address: String
            let placeName: String
        }
        
        struct CarInput {
            let name: String
        }
    }
    
    enum Edit {
        case profile(input: ProfileInput)
        
        struct ProfileInput {
            let name: String
        }
    }
}

这是枚举 class,非常易于使用,例如我可以像这样创建不同类型的对象:.add(input: .car(input: .init(name: "bmw")))。但对我来说,kotlin 中的 enum classes 不清楚,我发现了一些类似的 - sealed class 并且我尝试转换为:

sealed class QuestionnaireViewMode {
    sealed class add(input: Add)
    sealed class edit(input: Edit)

    sealed class Add {
        sealed class building(input: BuildingInput)
        sealed class car(input: CarInput)
        sealed class park

        data class BuildingInput(val address: String, val placeName: String)
        data class CarInput(val name: String)
    }

    sealed class Edit {
        sealed class profile(input: ProfileInput)
        data class ProfileInput(val name: String)
    }
}

这是正确的吗?

您的密封 类 需要扩展其父级。而且您使用 sealed class 而不是 fun 作为构建器函数,这没有意义。但是因为这些是 类 你不需要它,因为你可以直接调用构造函数。此外,由于您没有共同共享的状态,因此这些可以是密封接口而不是密封 类,这更简单一些,因为您不必担心构造函数。

以下是我的设计方式:

sealed interface QuestionnaireViewMode {
    sealed interface Add: QuestionaireViewMode {
        data class BuildingInput(val address: String, val placeName: String): Add
        data class CarInput(val name: String): Add
    }

    sealed interface Edit: QuestionaireViewMode {
        data class ProfileInput(val name: String): Edit
    }
}

用法:

val myInput: QuestionaireViewMode =
    QuestionaireViewMode.Add.CarInput(“bmw”)