如何循环Swift中的函数?

时间:2015-03-12 20:38:57

标签: ios loops swift

我知道这可能是一个愚蠢的问题,但我已经尝试了几个小时而且无法做到。所以,我正在做一个简单的游戏。我有4个功能可以让我的英雄死亡。他们每个人都在执行不同的动画,所以我希望程序知道究竟是谁杀死了一个英雄。我的逻辑是将这些函数放入数组中,但Xcode告诉我,我在调用中有一个“缺少参数#1的参数”。我忽略了这一点,并试图做一个switch语句。但每个“案例”都有一个错误,告诉我它正在期待一种模式。这是我的代码:

func didBeginContact(contact: SKPhysicsContact) {
    dead()
}

var deathArray:Array = [eatenByMouse(), eatenByCat(), eatenByHamster(), eatenByRabbit()]

func dead() {
    switch deathArray {
    case :
        eatenByMouse()
    case:
        eatenByCat()
    case:
        eatenByHamster()
    case:
        eatenByRabbit()
    default:
        cookie
    }

}    

这可能是一个非常简单的问题,但我是新手,不知道该怎么办。

我认为发布更多相关的代码示例是个好主意。我想,我的问题可能是碰撞。所以我有一个ColliderType:

enum ColliderType:UInt32 {
    case Cookie = 1
    case Rabbit = 2
    case Mouse = 3
    case Hamster = 4
    case Cat = 5
}

然后我为英雄和敌人制作了一个物理身体:

    self.cookie.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(self.cookie.size.width / 2))
self.cookie.physicsBody?.affectedByGravity = false
self.cookie.physicsBody?.categoryBitMask = ColliderType.Cookie.rawValue
self.cookie.physicsBody?.collisionBitMask = ColliderType.Mouse.rawValue
self.cookie.physicsBody?.contactTestBitMask = ColliderType.Mouse.rawValue

self.mouse.physicsBody = SKPhysicsBody(rectangleOfSize: self.mouse.size)
self.mouse.physicsBody?.dynamic = false
self.mouse.physicsBody?.categoryBitMask = ColliderType.Mouse.rawValue
self.mouse.physicsBody?.contactTestBitMask = ColliderType.Cookie.rawValue
self.mouse.physicsBody?.collisionBitMask = ColliderType.Cookie.rawValue    

eatenByMouse()函数示例:

func eatenByMouse() {
    self.groundSpeed = 0
    self.cookie.hidden = true
 let animateAction = SKAction.animateWithTextures(self.mouseArray, timePerFrame: 0.1)
    self.mouse.runAction(animateAction)
}

我希望它可以清除一些东西。 这似乎是一个很容易的问题,我很惭愧,我不理解它。

2 个答案:

答案 0 :(得分:2)

在第5行,您正在定义您的函数数组:

[ eatenByMouse(), eatenByCat(), ... ]

具有()语法的表达式实际上会调用该函数并解析它的返回值。尝试只使用函数名称但不调用它们。

[ eatenByMouse, eatenByCat, ... ]

答案 1 :(得分:1)

我假设您可以在didBeginContact中确定死亡类型。因此,您需要在此处确定死亡类型的索引,然后将其传递给death函数,以便它可以找到函数引用并执行它。

如果你的死亡类型函数接受参数或返回不同的结果,你需要相应地改变数组的类型。

func didBeginContact(contact: SKPhysicsContact) {
    // You will need to determine this index based on the type of contact/death.
    var deathIndex:Int = 0 // Index of the type of death (e.g. eatenByMouse in this case)

    dead(deathIndex)
}

var deathArray:Array<() -> ()> = [eatenByMouse, eatenByCat, eatenByHamster, eatenByRabbit]

func dead(deathIndex: Int) {
   deathArray[deathIndex]()
}