【问题标题】:Can I use a Selector with parenthesis in Swift?我可以在 Swift 中使用带括号的选择器吗?
【发布时间】:2016-10-04 06:41:25
【问题描述】:

我想知道如何在 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 中的任何帮助? 谢谢。 :)

【问题讨论】:

    标签: ios swift xcode selector swift3


    【解决方案1】:

    Swift 3

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

    【讨论】:

    • 更新和修复:)
    【解决方案2】:

    有可能...如果您是执行选择器的人。

    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")
    

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

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 1970-01-01
      • 2020-09-14
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多