字符串到Swift中的枚举映射

Dee*_*rma 4 enums swift

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

 public enum Command:String {

   case first = "FirstCommand"
   case second = "SecondCommand"
   ...
   ...
   case last = "lastCommand"
 }
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*den 10

我尝试Command使用传入字符串的原始值创建一个,并且仅使用switchif成功.如果失败,则在另一个例程中处理未知命令.

喜欢:

guard let command = Command(rawValue: incomingString) else {
    handleUnknownCommand(incomingString)
    return
}

switch command {
    case first:
        ...
}
Run Code Online (Sandbox Code Playgroud)

  • 一个可能的变体是`let command = Command(rawValue:incomingString)?? .unknown`与专门的`案件未知' (3认同)
  • 您可以定义`case unknown =""`,这使得不太可能发送确切的命令字符串:) - 但这只是一个建议,您的解决方案是完全正常的. (2认同)

Mar*_*n R 6

Joshua解决方案的一个小变形是在枚举中添加一个专用案例,用于所有未知命令:

public enum Command:String {

    case first = "FirstCommand"
    case second = "SecondCommand"
    // ...
    case last = "lastCommand"
    case unknown = "<unknownCommand>" 
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将(failable)初始化程序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
}
Run Code Online (Sandbox Code Playgroud)

使用哪个原始字符串都没有关系case unknown,因此您还可以定义

case unknown = ""
Run Code Online (Sandbox Code Playgroud)

如果你喜欢。编译器将验证该字符串是否与所有其他原始字符串不同。如果服务器碰巧发送了确切的字符串,则它将被映射到.unknown