Tôi đã tạo ra một cách để mô phỏng điều này (Không khác với những gì Marcos Crispino đề xuất về câu trả lời của mình). Xa một giải pháp hoàn hảo nhưng cho phép chúng tôi tránh những trường hợp chuyển đổi khó chịu cho mọi tài sản khác nhau mà chúng tôi muốn nhận được.
Bí quyết là sử dụng cấu trúc làm chủ sở hữu "dữ liệu/dữ liệu" và sử dụng nó làm RawValue trong chính enum.
Nó có một chút trùng lặp nhưng nó phục vụ tốt cho đến nay. Mỗi khi bạn muốn thêm một trường hợp enum mới, trình biên dịch sẽ nhắc nhở bạn điền vào trường hợp bổ sung trong getV rawue, sẽ nhắc bạn cập nhật init?
để nhắc bạn tạo thuộc tính tĩnh mới trên cấu trúc.
Gist
Mã đến 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
Nguồn
2016-11-28 14:35:13
Một giá trị gắn liền với mô tả sẽ không được chính xác cho những gì tôi muốn. Tất cả các trường hợp 'Teapot' phải có cùng một chuỗi; Tôi muốn sử dụng một giá trị String liên quan nếu tôi muốn đính kèm nói, một lưu ý về nguồn gốc của một cá thể lỗi cụ thể. –