Swift中

时间:2017-05-19 16:25:31

标签: swift enums

我在Swift中定义了一个枚举,如下所示:

 public enum Command:String {

   case first = "FirstCommand"
   case second = "SecondCommand"
   ...
   ...
   case last = "lastCommand"
 }

现在我从服务器收到一个命令字典,然后从中提取命令字符串。命令字符串通常是Command enum中的原始值之一,或者有时它可能是枚举之外的命令(例如,在客户端/服务器的未来版本中引入了新命令,但客户端仍然是旧的)。在这种情况下,在Swift 3中使用switch语句的方法是什么?在默认情况下,如何将命令字符串强制转换为枚举并处理未知命令?

4 个答案:

答案 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"