我在Swift中定义了一个枚举,如下所示:
public enum Command:String {
case first = "FirstCommand"
case second = "SecondCommand"
...
...
case last = "lastCommand"
}
现在我从服务器收到一个命令字典,然后从中提取命令字符串。命令字符串通常是Command enum中的原始值之一,或者有时它可能是枚举之外的命令(例如,在客户端/服务器的未来版本中引入了新命令,但客户端仍然是旧的)。在这种情况下,在Swift 3中使用switch语句的方法是什么?在默认情况下,如何将命令字符串强制转换为枚举并处理未知命令?
答案 0 :(得分:9)
我尝试使用传入字符串的原始值创建Command
,如果成功则仅使用switch
。如果失败,则在另一个例程中处理未知命令。
像:
guard let command = Command(rawValue: incomingString) else {
handleUnknownCommand(incomingString)
return
}
switch command {
case first:
...
}
答案 1 :(得分:4)
Joshua's solution的一小部分内容是添加专用内容 枚举用于所有未知命令的情况:
public enum Command:String {
case first = "FirstCommand"
case second = "SecondCommand"
// ...
case last = "lastCommand"
case unknown = "<unknownCommand>"
}
现在你可以使用(可用的)初始值设定项Command(rawValue:)
与nil-coalescing运算符??
一起映射传入的字符串
枚举值,映射所有未知命令
到.unknown
:
let command = Command(rawValue: incomingString) ?? .unknown
switch command {
case .first:
// Handle first command
case .second:
// Handle second command
case .last:
// Handle last command
case .unknown:
// Handle unknown command
}
case unknown
使用哪个原始字符串并不重要,所以你
也可以定义
case unknown = ""
如果你愿意,可以。编译器验证字符串是否不同
所有其他原始字符串。如果服务器碰巧发送那个确切的
然后它将被映射到.unknown
。
答案 2 :(得分:2)
这取决于你如何使用它,但你可以这样做:
0 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
7 10
1 [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
7 10
2 [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
5 8
3 [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
5 8
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0]
14 17
5 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0]
14 17
6 [1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1]
[0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0]
8 13
我不认为可以在返回时从服务器创建新命令,但是您可以构建一个具有func getCommand(for string: String) -> Command {
switch string {
case Command.first.rawValue: return .first
case Command.second.rawValue: return .second
...
default: return .newCommand
}
}
属性的类,该类需要command
并在整个应用程序中以不同的方式工作。
答案 3 :(得分:1)
作为替代结构,您可以使用可选的案例值并在交换机中添加nil
处理程序作为“默认”值:
enum Command: String {
case first = "a", second = "b", third = "c"
}
let command = Command(rawValue: "d")
switch command {
case .first?:
print("first")
case .second?:
print("second")
case .third?:
print("third")
case nil:
print("not found")
}
// prints "not found"