我可以在Swift中使用带括号的选择器吗?

时间:2016-10-04 06:41:26

标签: ios swift xcode selector swift3

我想知道如何在Swift 3中使用Selector,包括func所需的括号中的值。

let fireRecogniser = UISwipeGestureRecognizer(target: self, action: Selector(("shootShot")))

^这是我的识别器,但方法'shootShot'有一个Element的参数,我有enum

这是'shootShot'功能:

func shootShot(type: Element) {

    let shot = SKSpriteNode(imageNamed: "\(type)Shot")
    shot.texture?.filteringMode = SKTextureFilteringMode.nearest

    shot.position = CGPoint(x: -self.frame.width / 2 /*playerframe*/, y: -(self.frame.height / 2) + grnd.frame.height)
    shot.setScale(1)

    shot.physicsBody = SKPhysicsBody(circleOfRadius: (shot.frame.height / 2))
    shot.physicsBody?.affectedByGravity = false
    shot.physicsBody?.allowsRotation = true
    shot.physicsBody?.isDynamic = true
    shot.physicsBody?.restitution = 0
    shot.physicsBody?.angularDamping = 0
    shot.physicsBody?.linearDamping = 0
    shot.physicsBody?.friction = 0
    shot.physicsBody?.categoryBitMask = Contact.Shot.rawValue
    shot.physicsBody?.contactTestBitMask = Contact.Enemy.rawValue

    self.addChild(shot)

    // THIS WILL DEPEND ON DIFFICULTY
    let spin = SKAction.rotate(byAngle: 1, duration: 0.3)
    shot.run(SKAction.repeatForever(spin))
    let move = SKAction.moveTo(x: self.frame.width / 2, duration: 3.0)
    let remove = SKAction.removeFromParent()
    shot.run(SKAction.sequence([move, remove]))
}

如您所见,该方法具有该函数所需的Element

有关如何在Selector中添加该参数的任何帮助? 谢谢。 :)

2 个答案:

答案 0 :(得分:2)

Swift 3

中键入您的选择器
let fireRecogniser = UISwipeGestureRecognizer(target: self, action: #selector(shootShot(element:)))

答案 1 :(得分:1)

如果您是执行选择器的人,则可能......

perform()的重载有with:个参数。您在with:参数中传递的参数将传递给选择器方法。

示例:

// in some NSObject subclass's method
perform(#selector(myMethod), with: "Hello")

// in the same class
func myMethod(x: String) {
    print(x)
}

如果执行第一行,将打印“Hello”。

但是,在某些情况下,由于您不是选择器的执行者,因此无法使用所需的参数执行选择器。

您可以通过添加一个类级变量来解决此问题,该变量指示要使用以下方法调用方法的Element

var shotElement: Element!

在将目标和操作传递给手势识别器之前,您可以将其设置为某个值。

然后,在shootShot中访问它:

let shot = SKSpriteNode(imageNamed: "\(shotElement)Shot")

我承认这不是一个完美的解决方法,但它是最直接的。