如何在Swift

时间:2017-08-21 10:51:28

标签: swift

使用常量枚举似乎是一个简单而优雅的解决方案。有没有办法可以使用枚举实现嵌套字符串输出?

例如,考虑我有以下代码:

enum Const {
    enum Car {
        static let Door = "Door"
        static let Engine = "Engine"
    }
}

无论如何,我可以将“Car | Door”作为Const.Car.Door的输出吗?或“Car | Engine”作为Const.Car.Engine的输出?和“Car”作为Const.Car的输出?我在当前项目中定义了一些类似于命名空间模式的分析常量。它有很多嵌套的跟踪事件,如果我能实现我刚才描述的内容,那将非常有用。

我需要什么:

Const.Car应该输出“Car”

Const.Car.Door应该输出“Car | Door”

Const.Car.Engine应该输出“Car | Engine”

我不知道如何实现这一点。

编辑:

这也应该是可扩展的,

例如,

Const.Car.Door.Handle应该输出“Car | Door | Handle”

Const.Plane应该输出“Plane”

Const.Plane.Flaps应该输出“Plane | Flaps”

4 个答案:

答案 0 :(得分:3)

运算符重载可以帮助您实现类似的功能。 请看我的解决方案,你可以扩展它

enum Vehicle: String {
    case car = "Car"
    case airplane = "Airplane"

    enum CarPart: String {
        case door = "Door"
        case window = "Window"
    }
}

func > (left: Vehicle, right: Vehicle.CarPart) -> String {
    return left.rawValue + right.rawValue
}


let string = .car > .window // "CarWindow"

答案 1 :(得分:0)

我不久前有一个类似的问题,我设法用struct和enum来解决。在你的情况下,它看起来像这样:

struct Const{
   enum Car: String {
      case Door = "CarDoor"
      case Engine = "CarEngine"
   }
}

print("\(Const.Car.Door)") //CarDoor
print("\(Const.Car.Engine)") //CarEngine

我希望它适合你。

答案 2 :(得分:0)

这并不能完全满足您的要求,因为它在调用Const.Car时不会打印“Car”,但它可能会在某处启动:

enum Const {
    enum Car {
        static let identifier = "Car"
        static let Door = "\(Car.identifier)Door"
        static let Engine = "\(Car.identifier)Engine"
    }
}

print(Const.Car.Door) //CarDoor
print(Const.Car.Engine) //CarEngine

您可以通过拨打Const.Car.identifier打印“Car”。

答案 3 :(得分:0)

我能想到的最干净的方式是:

struct Const
{
    enum Car: String, CustomStringConvertible
    {
        case Door
        case Engine

        var description: String
        {
            return "Car\(self.rawValue)"
        }
    }
}

print("\(Const.Car.Door)")    // CarDoor
print("\(Const.Car.Engine)")  // CarEngine

实现您的需求,使添加新的箱子/零件变得非常容易,没有任何样板,如果您希望支持更多的车辆,那么抽象出这个功能会很简单。