是否可以在 Swift 的枚举中将多个案例分组并表示为另一个案例?
Is it possible group & represent multiple cases as another case within an enum in Swift?
这就是我的意思。
enum Device {
case iPhone_13Pro, iPhone_12Pro
case iPadPro_129
case iPadPro_11
}
// Hypothetical Scenario
enum Device_Group {
case iPhones
case iPads
}
有没有办法按照上面的方法来表示像这样的一组案例(它可以是另一个枚举,也可以是同一枚举中的不同案例 - 这样我就可以像下面那样做?
// DO THIS
switch device {
case iPhones:
print("These are iPhones")
case iPads:
print("These are iPads")
}
// INSTEAD OF THIS
switch device {
case .iPhone_13Pro, .iPhone_12Pro:
print("These are iPhones")
case .iPadPro_129, .iPadPro_11:
print("These are iPads")
}
我不知道这是否是一个奇怪的问题,但我发现在使用 switch 语句时将多个案例分组有一定的好处。对此有任何建议将不胜感激。提前致谢。
您可以使用嵌套枚举和带参数的案例
enum Devices {
case phone(iPhone)
case tablet(iPad)
enum iPhone {
case phone7
case phoneX
}
enum iPad {
case mini
case pro
}
}
let randomDevice = Devices.phone(.phone7)
switch randomDevice {
case .phone:
print("Its a phone")
default:
break
}
// prints "Its a phone"
您可以为 iPhone 和 iPad 定义两个不同的枚举,然后将它们用作设备类型的关联值。
https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
enum Ipad {
case iPadAir
case iPadPro
}
enum Iphone {
case iPhone12
case iPhone13
}
enum Device {
case iPad(model: Ipad)
case iPhone(model: Iphone)
}
func findDeviceType(device: Device) {
switch device {
case .iPad:
print("iPad")
case .iPhone:
print("iPhone")
}
}
findDeviceType(device: Device.iPad(model: .iPadAir)) // iPad
您也可以查看 OptionSet
,它是对项目进行分组和序列化的灵活方法,因为它们具有独特的价值。例如:
struct Device: OptionSet {
let rawValue: Int
static let iPhone_13Pro = Self(rawValue: 1 << 0)
static let iPhone_12Pro = Self(rawValue: 1 << 1)
static let iPadPro_129 = Self(rawValue: 1 << 2)
static let iPadPro_11 = Self(rawValue: 1 << 3)
static let iPhone: Self = [.iPhone_13Pro, .iPhone_12Pro]
static let iPad: Self = [.iPadPro_129, .iPadPro_11]
static let all: Self = [.iPhone, .iPad]
}
let device = Device.iPhone_13Pro
if Device.iPhone.contains(device) {
print("It's iPhone")
}
这就是我的意思。
enum Device {
case iPhone_13Pro, iPhone_12Pro
case iPadPro_129
case iPadPro_11
}
// Hypothetical Scenario
enum Device_Group {
case iPhones
case iPads
}
有没有办法按照上面的方法来表示像这样的一组案例(它可以是另一个枚举,也可以是同一枚举中的不同案例 - 这样我就可以像下面那样做?
// DO THIS
switch device {
case iPhones:
print("These are iPhones")
case iPads:
print("These are iPads")
}
// INSTEAD OF THIS
switch device {
case .iPhone_13Pro, .iPhone_12Pro:
print("These are iPhones")
case .iPadPro_129, .iPadPro_11:
print("These are iPads")
}
我不知道这是否是一个奇怪的问题,但我发现在使用 switch 语句时将多个案例分组有一定的好处。对此有任何建议将不胜感激。提前致谢。
您可以使用嵌套枚举和带参数的案例
enum Devices {
case phone(iPhone)
case tablet(iPad)
enum iPhone {
case phone7
case phoneX
}
enum iPad {
case mini
case pro
}
}
let randomDevice = Devices.phone(.phone7)
switch randomDevice {
case .phone:
print("Its a phone")
default:
break
}
// prints "Its a phone"
您可以为 iPhone 和 iPad 定义两个不同的枚举,然后将它们用作设备类型的关联值。
https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
enum Ipad {
case iPadAir
case iPadPro
}
enum Iphone {
case iPhone12
case iPhone13
}
enum Device {
case iPad(model: Ipad)
case iPhone(model: Iphone)
}
func findDeviceType(device: Device) {
switch device {
case .iPad:
print("iPad")
case .iPhone:
print("iPhone")
}
}
findDeviceType(device: Device.iPad(model: .iPadAir)) // iPad
您也可以查看 OptionSet
,它是对项目进行分组和序列化的灵活方法,因为它们具有独特的价值。例如:
struct Device: OptionSet {
let rawValue: Int
static let iPhone_13Pro = Self(rawValue: 1 << 0)
static let iPhone_12Pro = Self(rawValue: 1 << 1)
static let iPadPro_129 = Self(rawValue: 1 << 2)
static let iPadPro_11 = Self(rawValue: 1 << 3)
static let iPhone: Self = [.iPhone_13Pro, .iPhone_12Pro]
static let iPad: Self = [.iPadPro_129, .iPadPro_11]
static let all: Self = [.iPhone, .iPad]
}
let device = Device.iPhone_13Pro
if Device.iPhone.contains(device) {
print("It's iPhone")
}