2017-11-19 14 views
0

스위프트의 # 선택자 패러다임을 처음 사용했습니다. 궁극적으로 나는 spaceShip의 SKSpriteNode를 CGMutablePath 위로 이동시키고 spaceShip이 이동 한 경로에서 SKEmitterNodes로 배기 가스를 추가하려고합니다.이상한 스위프트의 선택기 동작. #selector를 통해 완전히 다른 매개 변수 값

그러나 저는 # 선택자 패러다임에 머물러 있습니다. 나는 addFumeToPosition(_ point: CGPoint) 함수에 타이머를 통해 SpaceShipSprite의 위치를 ​​보내려고하므로 나중에 그 위치에 SKEmitternode를 추가 할 수 있습니다.

#selector를 이해할 수없는 몇 가지 이유로 변수에 넣는 것과 완전히 다른 것을 보냅니다. 아래의 지문을 참조하십시오. 무슨 일 이니?

let spaceShipSprite = SKSpriteNode(texture: SKTexture(image: #imageLiteral(resourceName: "spaceShip"))) 

spaceShipSprite.position = CGPoint(x: 142.0, y:160.0) 
spaceShipSprite.name = "spaceShip" 
self.addChild(spaceShipSprite) 

print("spaceShipSprite.position before timer point x:\(spaceShipSprite.position.x) y:\(spaceShipSprite.position.y)") 

let gameTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector:#selector(addFumeToPosition(_:)), userInfo: spaceShipSprite.position, repeats: true) 

print("spaceShipSprite.position before timer point x:\(spaceShipSprite.position.x) y:\(spaceShipSprite.position.y)") 

... 타이머 점 X 전에

func addFumeToPosition(_ point: CGPoint){ 
     print("spaceShipSprite.position during point x:\(point.x) y:\(point.y)") 
} 

spaceShipSprite.position : 142.0 Y : 160.0

spaceShipSprite.position 타이머 점 X 후 : 142.0 Y : 160.0

spaceShipSprite . 타이머 포인트 x 동안의 위치 : 196092657881833.0 y : 1000000000.0

답변

2

너 그건 할 수 없어. 타겟/액션

지원되는 두 형태 (이 경우 Timer 인스턴스) 해당 클래스를 나타내는 하나 개의 파라미터

func addFumeToPosition(_ timer: Timer) 
으로 파라미터

func addFumeToPosition() 
  • 없이

    • 이다

    매개 변수가 전달되면 Timer 인스턴스 여야합니다.

    모든 사용자 지정 매개 변수는 userInfo 매개 변수를 통해 전달되고 처리되어야합니다.

    func addFumeToPosition(_ timer: Timer){ 
        let point = timer.userInfo as! CGPoint 
        print("spaceShipSprite.position during point x:\(point.x) y:\(point.y)") 
    } 
    

    참고 : 스위프트 4에서는 @objc 속성을 기능에 추가해야 할 수도 있습니다.

  • +0

    당신은이 두 형태가 '타이머'의 타겟/행동에 한정되어 있음을 분명히해야합니다. – rmaddy