当前位置: 首页 > 面试题库 >

我可以将Swift枚举中的不同关联值绑定到同一var吗?

艾意蕴
2023-03-14
问题内容

我做了一个小“ Angle”枚举,以便可以使用不同的可互换角度格式进行编程:

enum Angle {
    case Radians(CGFloat)
    case Degrees(CGFloat)
    case Rotations(CGFloat)
}

我发现这种方法有些多余的样板代码。例如,我想添加一个计算的var,它只返回原始底层关联的float:

var raw:CGFloat {
    switch self {
    case let .Radians(value):
        return value
    case let .Degrees(value):
        return value
    case let .Rotations(value):
        return value
    }
}

我试图将其更改为:

case .Radians(let value), .Degrees(let value):
    return value

我希望它足够聪明,以至于只能解决一场比赛,所以这场冲突是可忽略的。但是没有这样的设备。编译器说它不能解决两个let value语句之间的冲突。

那么我在Swift枚举中还没有发现一些惯用的聪明之处吗,那么它就可以做到了,这样我就不必在这里重复太多了?

另一个类似的例子是当我实现*函数时:

func * (lhs:Angle, rhs:CGFloat) -> Angle {
    switch lhs {
    case .Radians:
        return .Radians(lhs.raw * rhs)
    case .Degrees:
        return .Degrees(lhs.raw * rhs)
    case .Rotations:
        return .Rotations(lhs.raw * rhs)
    }
}

似乎应该有一种更简单的表达方式:“将相同的枚举类型与我的关联值乘以标量参数”。

(我不确定我在这个问题上是否有很好的头衔,可以随时改善/建议更好)


问题答案:

这是一个有趣的情况:枚举不是某种正确的数据类型,因为该值既不是弧度也不是以度为单位,两者都只是角度而不是真正不同的东西。也typealias Radians = Double没有用,因为没有单元安全

也许您可以使用如下所示的方法:

import Darwin

struct Angle {
    enum Unit {
        case Radians
        case Degrees
        case Rotations

        var radiansFactor : Double {
            switch self {
            case Radians: return 1
            case Degrees: return 180.0 / M_PI
            case Rotations: return 1 / 2 / M_PI
            }
        }
    }

    var unit : Unit {
        didSet {
            value /= oldValue.radiansFactor
            value *= unit.radiansFactor
        }
    }
    var value : Double
}

func * (var lhs: Angle, rhs: Double) -> Angle {
    lhs.value *= rhs
    return lhs
}

var angle = Angle(unit: .Degrees, value: 180)

angle.value             // 180.0
angle.unit = .Radians
angle.value             // 3.141592...
angle.unit = .Rotations
angle.value             // 0.5

哦,关于您的原始问题的答案:不,您不能。



 类似资料:
  • 问题内容: 我正在阅读Swift浏览文档,并且遇到了问题。这是代码: 该功能将无法正常工作,我想知道是否有一种方法可以更改枚举的关联值,以及如何更改? 问题答案: 最直接的问题是,当您应该使用声明不可变变量(用声明)时,您尝试更改其值。但是,由于您的变量包含关联值的副本,因此,这不会解决此特定问题,但是通常这是您需要注意的。 如果要解决此问题,则需要将该函数声明为muting函数,并根据具体情况将

  • 问题内容: 我想分享一些枚举属性。就像是: 我知道了为什么不能继承(因为状态在中没有表示形式),但是我仍然想说“ ActionState就像具有更多选项的State,并且ActionState可以获取类型为State的输入,因为它们也属于输入ActionState” 我知道如何获得上述逻辑来复制案例并在函数中进行切换。但我正在寻找更好的方法。 我知道枚举不能在Swift中继承,并且我已经阅读了sw

  • 我有一个实体,有一个枚举类型字段和一个具有相同枚举类型和字段名的DTO。 我使用modelMapper创建一个新对象,不需要额外的配置。 但在将dto映射到实体对象后,实体对象上的性别为空。 对象有性别,我已经检查了很多。 请帮我理解这个问题。

  • 首先,这就是为什么这个问题不是重复的: 我知道在SO上已经问了很多关于将一个转换为另一个的问题,我甚至自己回答了其中一个问题,但是我在这个主题上发现的所有问题都有一些比较不同枚举值的方法(无论是通过名称还是按价值)。在我的特殊情况下,我不知道值,名字也不匹配。 作为我正在做的一个名为ADONETHelper的GitHub项目的一部分,该项目旨在最大限度地减少与Ado一起工作时的代码重复。Net中,

  • 我想在我的项目中包含swagger,但我不能更改代码或变量名称。 我有一个返回列表的服务: 代码变量来自枚举操作可能的错误: 是否可以将“代码”和TYPE枚举相关联,以便我可以在生成的swagger文档中显示选项列表? 谢谢

  • 本文向大家介绍深入探究Swift枚举关联值的内存,包括了深入探究Swift枚举关联值的内存的使用技巧和注意事项,需要的朋友参考一下 这是枚举最基础的用法,但是在swift中,对枚举的功能进行了加强,也就是关联值。 关联值可以将额外信息附加到 enum case中,像下面这样子。 我们可以看到,在我们创建一个枚举值t的时候,设置他的选项为test1,同时可以关联3个Int类型的值,然后在switch