你能在Swift中继承enum吗?关于枚举继承,应该注意哪些规则?
以下测试代码:
enum TemperatureUnit: Int {
case Kelvin, Celcius, Farenheit
}
enum TemperatureSubunit : Temperature {
}
Run Code Online (Sandbox Code Playgroud)
生成
error: type 'TemperatureSubunit' does not conform to protocol 'RawRepresentable'
Run Code Online (Sandbox Code Playgroud) 注意:这与我昨天在Stackoverflow上发布的另一个问题基本相同.但是,我认为我在那个问题中使用了一个不好的例子,这个例子并没有完全归结为我的想法.由于对原始帖子的所有回复都提到了第一个问题,我认为将新示例放在一个单独的问题中可能更好一点 - 没有重复的意图.
让我们定义一个简单游戏中使用的方向枚举:
enum Direction {
case up
case down
case left
case right
}
Run Code Online (Sandbox Code Playgroud)
现在在游戏中我需要两种角色:
HorizontalMover只能左右移动的A.VerticalMover只能上下移动.他们都可以移动所以他们都实现了
protocol Movable {
func move(direction: Direction)
}
Run Code Online (Sandbox Code Playgroud)
那么让我们定义两个结构:
struct HorizontalMover: Movable {
func move(direction: Direction)
let allowedDirections: [Direction] = [.left, .right]
}
struct VerticalMover: Movable {
func move(direction: Direction)
let allowedDirections: [Direction] = [.up, .down]
}
Run Code Online (Sandbox Code Playgroud)
...使用这种方法是我仍然可以将不允许的值传递给move()函数,例如以下调用将是有效的:
let horizontalMover = HorizontalMover()
horizontalMover.move(up) …Run Code Online (Sandbox Code Playgroud) 这就是我的意思。
enum Device {
case iPhone_13Pro, iPhone_12Pro
case iPadPro_129
case iPadPro_11
}
// Hypothetical Scenario
enum Device_Group {
case iPhones
case iPads
}
Run Code Online (Sandbox Code Playgroud)
有没有办法按照上面的方法来表示像这样的一组特定情况(它可以是另一个枚举或同一枚举中的不同情况 - 这样我就可以执行以下操作?
// 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")
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是一个奇怪的问题,但我发现在使用 switch 语句时对多个案例进行分组有一定的好处。对此有任何建议将不胜感激。提前致谢。