使用常量枚举似乎是一个简单而优雅的解决方案。有没有办法可以使用枚举实现嵌套字符串输出?
例如,考虑我有以下代码:
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”
答案 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
实现您的需求,使添加新的箱子/零件变得非常容易,没有任何样板,如果您希望支持更多的车辆,那么抽象出这个功能会很简单。