Статьи

Пример использования расширений в Swift

Недавно мне понадобилось изображение в моем приложении iOS, которое колеблется. Я натолкнулся на пример кода Swift, который показал, как это сделать, и на самом деле это было довольно легко сделать (см. Теорию, лежащую в основе формулы). Код использует функцию «расширения» в Swift. Это действительно крутая функция в Swift. Эта функция позволяет расширять функциональность класса без необходимости расширять класс (как, например, в Java). Для основного примера функции см. Этот пример . В моем примере эта функция используется для расширения функциональности класса SKAction , еще одной интересной вещи в библиотеке iOS SpriteKit.

Расширение выглядит так:

01
02
03
04
05
06
07
08
09
10
11
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
    }
}

Вы можете использовать расширение и применить его к SpriteNode в вашем GameScene.swift, например, так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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))
    }
}

Как видите, я игнорировал гравитацию и другие «силы» на объекте. Это приводит к следующему поведению: подпрыгивание-ball1