Как передать тип сцены функции как правило c? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть следующий код, который Xcode генерирует при создании проекта SpriteKit + GameplayKit:

override func viewDidLoad() {
    super.viewDidLoad()

    // Load 'GameScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    if let scene = GKScene(fileNamed: "GameScene") {

        // Get the SKScene from the loaded GKScene
        if let sceneNode = scene.rootNode as! GameScene? {

            // Copy gameplay related content over to the scene

            // Set the scale mode to scale to fit the window
            sceneNode.scaleMode = .aspectFill

            // Present the scene
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)

                view.ignoresSiblingOrder = true

                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    }
}

Для тестирования разных сцен я бы предпочел переместить весь код после super.viewDidLoad () в функция, так что я могу легко тестировать различные сцены без необходимости редактировать много кода.

Строка, на которой я застреваю:

if let sceneNode = scene.rootNode as! GameScene? 

Я не уверен, как Я могу передать тип класса обобщенным c способом в функцию, поэтому вместо GameScene? я могу передать правильный тип сцены.

Как мне это сделать?

1 Ответ

1 голос
/ 19 апреля 2020

Вы можете использовать еще несколько обобщенных c, таких как фактический шаблонный код:

override func viewDidLoad() {
    super.viewDidLoad()

    if let view = self.view as! SKView? {
        if let scene = SKScene(fileNamed: "GameScene") {
            scene.scaleMode = .aspectFill
            view.presentScene(scene)
        }
        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true
    }
}

Если все ваши сцены наследуются от SKScene, у вас не будет проблем.

Но если вам действительно нужно передать класс Type для загрузки функции, вы можете сделать что-то вроде этого:

func loadScene<T>(named name: String, classType: T.Type) -> T? {
    return SKScene(fileNamed: name) as? T
}

И использовать:

let newScene = loadScene(named: "some", classType: GameScene.self)
// newScene is Optional(GameScene) type.

Конечно, вы можете удалить необязательную замену T? и контролировать ноль нагрузки.

...