是否可以从枚举方法内部更改枚举?

迈克尔·齐默曼(Michael Zimmerman)

我在Swift中有一个枚举:

enum Orientation: Int
{
    case Rot_0 = 0, Rot_90, Rot_180, Rot_270

和我的枚举中的一种非静态方法,该方法旨在顺时针或逆时针移动方向:

    func rotate(clockwise: Bool)
    {
        var nextRawValue = self.rawValue + (clockwise ? 1 : -1)

        if nextRawValue < Orientation.Rot_0.rawValue
        {
            nextRawValue = Orientation.Rot_270.rawValue
        }
        else if nextRawValue > Orientation.Rot_270.rawValue
        {
            nextRawValue = Orientation.Rot_0.rawValue
        }

        self = Orientation(rawValue: nextRawValue)
}

编译器告诉我您不能self在方法中分配给它。我无法理解为什么这是不可能的。

我唯一想到的就是拥有一个静态方法rotate(orientation: Orientation, clockwise: Bool),但是在这种情况下,必须将返回值显式分配回enum变量,这对我来说就像是不好的编码。说出来myOrientation.rotate()并隐式更改值似乎更有用

有没有解决这个问题的好方法?

谢谢你们!

内特·库克(Nate Cook)

当您要在方法中修改值类型(即structenum)时,需要将其标记为mutating这将使该方法可用于可变实例(用声明var ...),但不能用于不可变实例(let ...):

mutating func rotate(clockwise: Bool)
{
    var nextRawValue = self.rawValue + (clockwise ? 1 : -1)

    if nextRawValue < Orientation.Rot_0.rawValue
    {
        nextRawValue = Orientation.Rot_270.rawValue
    }
    else if nextRawValue > Orientation.Rot_270.rawValue
    {
        nextRawValue = Orientation.Rot_0.rawValue
    }

    self = Orientation(rawValue: nextRawValue)!
}

请注意,解决变异错误会揭示另一个错误-Orientation(rawValue: nextRawValue)返回一个可选参数,因此您需要先将其展开,然后才能分配给self如果正确实现了先前的逻辑,则应该安全地使用force unwrapping运算符!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以枚举可通过[ADSI]对象的Invoke()使用的所有方法和属性?

来自分类Dev

是否可以在ABAP中创建枚举(枚举)?

来自分类Dev

emacs是否可以在C ++枚举中对齐'='

来自分类Dev

是否可以保证外部类中的静态初始化器在内部枚举初始化之前运行?

来自分类Dev

与枚举

来自分类Dev

我在一个枚举变量中设置了三个枚举常量,是否有一种方法可以从枚举变量中将其作为数组检索?

来自分类Dev

是否有本机函数检查值是否在枚举内部?

来自分类Dev

是否可以为枚举类枚举器别名?

来自分类Dev

AspectJ-是否可以扩展枚举的值?

来自分类Dev

我们可以在Hibernate上保留内部枚举吗?

来自分类Dev

是否可以从枚举方法内部更改枚举?

来自分类Dev

C ++:使用“枚举类”在类内部枚举

来自分类Dev

我们可以更改原子枚举,还是可以向原子枚举添加任何新值?

来自分类Dev

是否可以快速通过枚举传递枚举

来自分类Dev

枚举内部类

来自分类Dev

Java-可以枚举抽象方法的参数

来自分类Dev

使用枚举内部的接口

来自分类Dev

是否可以向元组添加枚举?

来自分类Dev

是否可以在RealmSwift中使用枚举?

来自分类Dev

是否可以为枚举设置某种接口?

来自分类Dev

有什么方法可以在枚举之间继承?

来自分类Dev

是否有一种新方法可以在Rails 5.2上调用枚举?

来自分类Dev

是否可以在ABAP中创建枚举(枚举)?

来自分类Dev

AspectJ-是否可以扩展枚举的值?

来自分类Dev

是否有任何方法可以获取在FlagsAttributed枚举中不是类型的所有Flag?

来自分类Dev

是否可以在git log中枚举提交?

来自分类Dev

是否可以禁用Samba用户枚举?

来自分类Dev

是否可以按类型遍历枚举?

来自分类Dev

是否可以在编译时检查是否包含枚举的语句

Related 相关文章

  1. 1

    是否可以枚举可通过[ADSI]对象的Invoke()使用的所有方法和属性?

  2. 2

    是否可以在ABAP中创建枚举(枚举)?

  3. 3

    emacs是否可以在C ++枚举中对齐'='

  4. 4

    是否可以保证外部类中的静态初始化器在内部枚举初始化之前运行?

  5. 5

    与枚举

  6. 6

    我在一个枚举变量中设置了三个枚举常量,是否有一种方法可以从枚举变量中将其作为数组检索?

  7. 7

    是否有本机函数检查值是否在枚举内部?

  8. 8

    是否可以为枚举类枚举器别名?

  9. 9

    AspectJ-是否可以扩展枚举的值?

  10. 10

    我们可以在Hibernate上保留内部枚举吗?

  11. 11

    是否可以从枚举方法内部更改枚举?

  12. 12

    C ++:使用“枚举类”在类内部枚举

  13. 13

    我们可以更改原子枚举,还是可以向原子枚举添加任何新值?

  14. 14

    是否可以快速通过枚举传递枚举

  15. 15

    枚举内部类

  16. 16

    Java-可以枚举抽象方法的参数

  17. 17

    使用枚举内部的接口

  18. 18

    是否可以向元组添加枚举?

  19. 19

    是否可以在RealmSwift中使用枚举?

  20. 20

    是否可以为枚举设置某种接口?

  21. 21

    有什么方法可以在枚举之间继承?

  22. 22

    是否有一种新方法可以在Rails 5.2上调用枚举?

  23. 23

    是否可以在ABAP中创建枚举(枚举)?

  24. 24

    AspectJ-是否可以扩展枚举的值?

  25. 25

    是否有任何方法可以获取在FlagsAttributed枚举中不是类型的所有Flag?

  26. 26

    是否可以在git log中枚举提交?

  27. 27

    是否可以禁用Samba用户枚举?

  28. 28

    是否可以按类型遍历枚举?

  29. 29

    是否可以在编译时检查是否包含枚举的语句

热门标签

归档