swift - 枚举案例可以包含类列表吗?

标签 swift enums subclass

枚举可以包含类列表吗?

我有一个父类(super class) Activity:SKScene { },它有子私有(private)类 Activity01:Activity { },子私有(private)类 Activity02:Activity { } 和一个子私有(private)类 Activity03:Activity { }。 每个子私有(private)类(class)都包含一个定时事件。当计时器在用户解决事件之前用完时,会弹出一个 GameOver 场景(类 GameOver: Activity { })(带有文本“Bad luck try again”)。

我正在尝试在 GameOver 类中创建一个枚举,以在触摸开始时触发,使用户返回到他们的上一个事件,但我无法解决这个问题。点击时它总是返回到 Activity01。

这是我的尝试:

 …}  // Activity03 sub-private class closure


    class GameOver: Activity {

        enum classes {
            case Activity01
            case Activity02
            case Activity03
                  }

        var firstClass = classes.Activity01
        var secondClass = classes.Activity02
        var thirdClass = classes.Activity03

        let restartGameText = SKLabelNode(fontNamed: "AvenirNext-HeavyItalic")

        init(size: CGSize, won:Bool) {
            super.init(size: size)

            startGameText.removeFromParent()

            restartGameText.text = "Bad luck try again"
            restartGameText.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.center
            restartGameText.verticalAlignmentMode = SKLabelVerticalAlignmentMode.center
            restartGameText.fontSize = 60
            restartGameText.fontColor = SKColor(red: 230/255, green: 60/255, blue: 70/255, alpha: 1)
            restartGameText.position = CGPoint(x: scene!.size.width/2.0, y: scene!.size.height/2.0)
            restartGameText.zPosition = 5
            addChild(restartGameText)

            let pulseAction = SKAction.sequence([SKAction.fadeAlpha(to: 1, duration: 1), SKAction.fadeAlpha(to: 0.7, duration: 1)])
            restartGameText.run(SKAction.repeatForever(pulseAction))

        }

        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }


        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

            if firstClass == classes.Activity01 {

                let transition = SKTransition.fade(withDuration: 2.0)
                let activity01 = Activity01(size: size)
                view?.presentScene(activity01, transition: transition)

            } else if secondClass == classes.Activity02 {

                let transition = SKTransition.fade(withDuration: 2.0)
                let activity02 = Activity02(size: size)
                view?.presentScene(activity02, transition: transition)

            } else if thirdClass == classes.Activity03 {

                let transition = SKTransition.fade(withDuration: 2.0)
                let activity03 = Activity03(size: size)
                view?.presentScene(activity03, transition: transition)

            }
        }
    }   //GameOver class closure
}  // Activity Superclass closure

如果 Activity02 或 Activity03 是最后一个事件,是否有办法返回到它们?

最佳答案

下面的枚举声明非常好。但是这里没有枚举类型作为类。它只是一个没有任何类型的枚举,这在 Swift 中是允许的。

   enum classes {
        case Activity01
        case Activity02
        case Activity03
   }

仅供引用 Enum来自 Apple 的“The Swift Programming Language”:

Swift enumeration cases don’t have an integer value set by default, unlike languages like C and Objective-C.....Instead, the different enumeration cases are values in their own right.

总是得到 Activity01 的原因是,您在代码中将 firstClass 分配为 Activity01 等等。

var firstClass = classes.Activity01
var secondClass = classes.Activity02
var thirdClass = classes.Activity03

因此,当 firstClasstouchesBegan 方法中的 classes.Activity01 进行比较时,它总是匹配的。这就是您始终获得“Activity01”的原因。

你应该有实例成员来跟踪 enum classes 类型的 lastClass 并且它应该与 classes.Activity01/02/03 进行比较在 touchesBegan 方法中,而不是将其与 firstClassclasses.Activity01 等进行比较。应该是这样的。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    if lastClass == classes.Activity01 {

        let transition = SKTransition.fade(withDuration: 2.0)
        let activity01 = Activity01(size: size)
        view?.presentScene(activity01, transition: transition)

    } else if lastClass == classes.Activity02 {

        let transition = SKTransition.fade(withDuration: 2.0)
        let activity02 = Activity02(size: size)
        view?.presentScene(activity02, transition: transition)

    } else if lastClass == classes.Activity03 {

        let transition = SKTransition.fade(withDuration: 2.0)
        let activity03 = Activity03(size: size)
        view?.presentScene(activity03, transition: transition)

    }
}

这样即使是Activity 02/03也能正确显示上一个Activity类。

关于swift - 枚举案例可以包含类列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55998229/

相关文章:

c - 使用#define 重新定义枚举枚举数

java - 使用二元运算查明 int 是否包含枚举集中的元素

ios - 使用 Swift 创建 SKSpriteNode 子类

python - 如何使用Python获取子类的完整类名

ios - 在展开可选值 WKWebView 获取参数时意外发现 nil

ios - 在 CollectionView 上滑动删除

enums - 有没有办法在环境的 typescript 中创建枚举?

json - 在方法体 <T> 中使用泛型参数

swift - 确保代码块在异步函数之后执行

c# - 构造函数可以返回子类吗?