我在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)
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。