在Swift中使用扩展的示例

最近,我需要在iOS应用程序中振荡图像。 我遇到了一个Swift代码示例,该示例演示了如何执行该操作,并且实际上很容易做到(有关公式背后的理论请参见this )。 该代码利用了Swift中的“扩展”功能。 这是Swift中一个非常酷的功能。 该功能使您可以扩展类的功能,而不必扩展类(例如您在Java中所做的事情)。 有关此功能的基本示例,请参见以下示例 。 在我的示例中,该功能用于扩展SKAction类的功能, 是iOS SpriteKit库中的另一个很酷的功能。

扩展名如下所示:

let π = CGFloat(M_PI)

extension SKAction {
    static func oscillate(amplitude a: CGFloat, timePeriod t: CGFloat, midPoint: CGPoint) -> SKAction {
        let action = SKAction.customActionWithDuration(Double(t)) { node, currentTime in
            let displacement = a * sin(2 * π * currentTime / t)
            node.position.y = midPoint.y - displacement
        }
        return action
    }
}

您可以使用扩展并将其应用于GameScene.swift中的SpriteNode,例如:

import SpriteKit

class GameScene: SKScene {
    
    let ball = SKSpriteNode(imageNamed: "ball")
    
    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        backgroundColor = SKColor.clearColor()
        
        ball.position = CGPoint(x: size.width * 0.5, y: size.height * 0.5)
        
        addChild(ball)
        
        ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.size.width)
        ball.physicsBody?.restitution = 0.0
        ball.physicsBody?.linearDamping = 0.0
        ball.size = CGSize(width: 100, height: 100)
        ball.physicsBody?.affectedByGravity = false
        
        let oscillate = SKAction.oscillation(amplitude: size.height/4, timePeriod: 8, midPoint: ball.position)
        ball.runAction(SKAction.repeatActionForever(oscillate))
    }
}

如您所见,我忽略了物体上的重力和其他“力”。 这导致以下行为: 弹跳球1

翻译自: https://www.javacodegeeks.com/2016/01/example-using-extensions-swift.html