我遇到的情况是我尝试对某些数据进行二进制解码,数据类型同时具有数值,字符串值和名称。我正在考虑使用如下的枚举:
enum TARGET_TRACK_TYPE : String {
case TT_INVALID = "Invalid"
case TT_TRUE_TRACK_ANGLE = "True Track Angle"
case TT_MAGNETIC = "Magnetic"
case TT_TRUE = "True"
}
但我也知道:
TT_INVALID = 0
和TT_TRUE_TRACK_ANGLE = 1
等。是否有一种简单的方法来封装这些"事物"将字符串和数值放入枚举构造中或者我需要制作某种结构/类来处理它吗?
我想我想做像
这样的事情 let a = TARGET_TRACK_TYPE.rawValue(value: 2)
println(a)
会打印True Track Angle
同样,我知道这可以用结构或类来完成,但我对枚举特别感兴趣
或者另一个例子:
/// Emitter Category is defined in section 3.5.1.10 of the GDL90 Spec
struct EmitterCategory {
let category : Int
func getString() -> String {
switch(category) {
case 0:
return "No aircraft type information";
case 1:
return "Light";
case 2:
return "Smalle";
case 3:
return "Large";
case 4:
return "High Vortex Large";
case 5:
return "Heavy";
case 6:
return "Highly Manuverable";
case 7:
return "Rotorcraft";
case 8:
return "(Unassigned)";
case 9:
return "Glider/sailplane";
case 10:
return "Ligther than air";
case 11:
return "Parachutist/sky diver";
case 12:
return "Ultra light/hang glider/paraglider";
case 13:
return "(Unassigned)";
case 14:
return "Unmanned aerial vehicle";
case 15:
return "Space/transatmospheric vehicle";
case 16:
return "(Unassigned)";
case 17:
return "Surface vehicle - emergency vehicle";
case 18:
return "Surface vehicle - service vehicle";
case 19:
return "Point obstacle";
case 20:
return "Cluster Obstacle";
case 21:
return "Line Obstacle";
default:
return "(reserved)";
}
}
}
有没有办法将这个结构重构为一个枚举,以便我用一个整数值构造枚举,但我"读"枚举作为字符串?我很确定答案是否定的。
答案 0 :(得分:30)
我认为这会为我做。谢谢你自己.. :)
protocol GDL90_Enum {
var description: String { get }
}
enum TARGET_ADDRESS_TYPE : Int, GDL90_Enum {
case ADSB_ICAO_ADDRESS = 0
case ADSB_SELF_ADDRESS = 1
case TISB_ICAO = 2
case TISB_TRACK_ID = 3
case SURFACE_VEHICLE = 4
case GROUND_STATION = 5
var description: String {
switch self {
case .ADSB_ICAO_ADDRESS:
return "ADS-B with ICAO address"
case .ADSB_SELF_ADDRESS:
return "ADS-B with Self-assigned address"
case .TISB_ICAO:
return "TIS-B with ICAO address"
case .TISB_TRACK_ID:
return "TIS-B with track file ID"
case .SURFACE_VEHICLE:
return "Surface Vehicle"
case .GROUND_STATION:
return "Ground Station Beacon"
default:
return "Reserved"
}
}
}
答案 1 :(得分:5)
使用Swift 4.2,可以使用CaseIterable完成此操作。一种相对简洁的方法是执行以下操作
enum Directions: String, CaseIterable {
case north, south, east, west
static var asArray: [Directions] {return self.allCases}
func asInt() -> Int {
return Directions.asArray.firstIndex(of: self)!
}
}
print(Directions.asArray[2])
// prints "east\n"
print(Directions.east.asInt())
// prints "2\n"
print(Directions.east.rawValue)
// prints "east\n"
答案 2 :(得分:0)
你考虑过使用字典吗?
let targetTrackDict: [Int: String] =
[99: "Invalid",
1: "True Track Angle",
2: "Magnetic",
5: "True"]
请注意,数字代码不必订购或连续。在声明中具体说明字典的类型可以防止以下片段中的大量警告或错误。
获取代码的名称很简单:
var code = 2
if let name = targetTrackDict[code] {
print("\(name) has code \(code)")
} else {
print("\(code) is not a valid track type")
}
我还没有找到一个获取名称代码的简洁方法,但这样做:
let magneticCode = targetTrackDict.first(where:
{key, value in value == "Magnetic"})?.key
// returns an optional
你当然会把它打扮成一个功能。你没有自动获得的是你的赛道类型的内部名称,但你需要一个吗?上面这一行在某种程度上适合你。
答案 3 :(得分:0)
您应该使用RawRepresentable
<?php
$categoryKey = 'structure';
$category = getCategory($categoryKey);
$featured = array_slice($category->pages(), 0, 3);
$content = array_slice($content, 1); ?>
<?php
foreach ($featured as $pageKey):
?>
<?php $page = new Page($pageKey); ?>