Stworzyłem sposób na symulację tego (nie różni się od tego, co sugerował Marcos Crispino w swojej odpowiedzi). Daleko od idealnego rozwiązania, ale pozwala nam uniknąć tych nieprzyjemnych przypadków przełączania dla każdej innej właściwości, którą chcemy uzyskać.
Sztuką jest użycie struct jako właściciela "własności/danych" i użycie go jako wartości Raw w samym wyliczeniu.
Ma trochę duplikatów, ale dobrze mi to służy. Za każdym razem, gdy chcesz dodać nowy przypadek enum, kompilator przypomni ci, aby wypełnić dodatkowy przypadek w rawValue getter, co powinno przypomnieć o aktualizacji init?
, która przypomina o utworzeniu nowej właściwości statycznej w strukturze.
Gist
Kod do Gist:
enum VehicleType : RawRepresentable {
struct Vehicle : Equatable {
let name: String
let wheels: Int
static func ==(l: Vehicle, r: Vehicle) -> Bool {
return l.name == r.name && l.wheels == r.wheels
}
static var bike: Vehicle {
return Vehicle(name: "Bicycle", wheels: 2)
}
static var car: Vehicle {
return Vehicle(name: "Automobile", wheels: 4)
}
static var bus: Vehicle {
return Vehicle(name: "Autobus", wheels: 8)
}
}
typealias RawValue = Vehicle
case car
case bus
case bike
var rawValue: RawValue {
switch self {
case .car:
return Vehicle.car
case .bike:
return Vehicle.bike
case .bus:
return Vehicle.bus
}
}
init?(rawValue: RawValue) {
switch rawValue {
case Vehicle.bike:
self = .bike
case Vehicle.car:
self = .car
case Vehicle.bus:
self = .bus
default: return nil
}
}
}
VehicleType.bike.rawValue.name
VehicleType.bike.rawValue.wheels
VehicleType.car.rawValue.wheels
VehicleType(rawValue: .bike)?.rawValue.name => "Bicycle"
VehicleType(rawValue: .bike)?.rawValue.wheels => 2
VehicleType(rawValue: .car)?.rawValue.name => "Automobile"
VehicleType(rawValue: .car)?.rawValue.wheels => 4
VehicleType(rawValue: .bus)?.rawValue.name => "Autobus"
VehicleType(rawValue: .bus)?.rawValue.wheels => 8
podania wartości z opisu nie byłoby właściwe dla tego, co chcę. Wszystkie instancje 'Teapot' powinny mieć ten sam ciąg znaków; Chciałbym użyć powiązanej wartości typu String, jeśli chciałbym dołączyć say, notatkę na temat źródła określonej instancji błędu. –