ios - 从 Swift 中的枚举中返回一个随机案例
问题描述
我刚刚写了一个函数,它生成一个 0...2 范围内的随机整数。目标是根据随机整数从枚举中返回一个随机案例。
我更喜欢使用 case 语句,但我不喜欢返回任意枚举的默认 case。省略默认情况将不起作用,因为 switch 无法知道会发生多少情况。即使默认情况永远不会发生,我也不认为这是一个干净的解决方案。
您更喜欢哪个解决方案分别认为是最干净的解决方案 - 请详细说明。有没有更好/更优雅的方式从枚举中返回随机案例?
If-else 解决方案:
func generateRandomSign() -> Sign {
let randomSelection = Int.random(in: 0...2)
if randomSelection == 0 {
return .rock
} else if randomSelection == 1 {
return .paper
}
return .scissor
}
开关解决方案:
func generateRandomSign() -> Sign {
let randomSelection = Int.random(in: 0...2)
switch randomSelection {
case 0: return .rock
case 1: return .paper
case 2: return .scissor
default: return .rock
}
}
解决方案
没有必要搞乱Int
s。您应该声明您Sign
enum
符合CaseIterable
并调用randomElement()
它的allCases
属性(顾名思义,它包含 的所有情况enum
)。
这样您就不会牺牲类型安全性,并且保证Sign
每次都能取回一个案例。
enum Sign: CaseIterable {
case rock
case paper
case scissor
static func random() -> Sign {
return allCases.randomElement()! // safe to force unwrap, since the enum has at least 1 property, so this can never be `nil`
}
}
你可以这样称呼它let randomSign = Sign.random()
推荐阅读
- laravel - Laravel 每个页面都有一个字符按钮
- woocommerce - WooCommerce:如何在结帐时复制延期交货产品的运费?
- wso2 - 有没有办法从序列中调用 WSO2 代理服务?
- python - Python Flask ajax POST 400 BAD REQUEST
- rust - 如何在 Bevy 中任意移动用户输入的相机
- python - 使用 format() 函数的粗体文本
- python - 用户输入“0”后如何退出while循环?如果用户输入其他任何内容,我希望它继续
- xamarin - 如何在同一个应用程序会话中更新 xamarin Essentials 首选项
- dart - 如何在 Dart 中声明一个锯齿状数组
- r - 从边界内填充 OSM 数据的 PostGis 数据库中查询所有主要道路