Swift - 如何将此方法推广到我的超类中?

时间:2015-01-02 17:44:34

标签: generics inheritance swift methods struct

我正在为游戏分配资源。我有一个超类BaseScene,两个孩子GameScene和HyperScene。

GameScene和HyperScene都在另一个线程上预加载他们的资源,但他们用来执行此操作的方法基本相同。

GameScene

class func createResources(config: GameSceneConfig, withCompletion: (scene: GameScene) -> ()){

    // load resources on other thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {

        self.createTextures()  // need to load textures before scene is created
        let gameScene = GameScene(config: config)

        // callback on main thread
        dispatch_async(dispatch_get_main_queue(), {
            // Call the completion handler back on the main queue.
            withCompletion(scene: gameScene)
        });
    })
}

BaseScene

class func createResources(config: HyperSceneConfig, withCompletion: (scene: HyperScene) -> ()){

    // load resources on other thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {

        self.createTextures()
        let hyperScene = HyperScene(config: config)

        // callback on main thread
        dispatch_async(dispatch_get_main_queue(), {
            // Call the completion handler back on the main queue.
            withCompletion(scene: hyperScene)
        });
    })

}

config是一个包含参数的结构。 HyperScene和GameScene都有自己的特殊结构。在我的createResources方法中,我非常确定我可以声明BaseScene,然后在调用方法时将其作为其子项之一抛出。似乎大多数困难在于传递一个通用结构。

这是两个结构

struct HyperSceneConfig {
    var size: CGSize
    var viewController: GameViewController

    init(size: CGSize, viewController: GameViewController){
        self.size = size
        self.viewController = viewController
    }
}


struct GameSceneConfig {
    var size: CGSize
    var viewController: GameViewController
    var curLevel: Int
    var curSector: Int
    var lives: Int

    init(size: CGSize, viewController: GameViewController, curSector: Int, curLevel: Int, lives: Int = 3, startPoint: CGPoint? = nil){
        self.size = size
        self.viewController = viewController
        self.curLevel = curLevel
        self.curSector = curSector
        self.lives = lives
    }
}

HyperScene将第一个作为参数。 GameScene选择了第二个。

1 个答案:

答案 0 :(得分:0)

让您的GameSceneConfigHyperSceneConfig延伸到同一个班级。然后只需调用它们的通用初始化程序。

修改

class func createResources(config: GameSceneConfig, withCompletion: (scene: GameScene) -> ())

class func createResources(config: configName, withCompletion: (scene: GameScene) -> ()) ->())

你在哪里

让hyperScene = HyperScene(config:config)

那就变成了

let scene = sceneInit(config: configName)

创建一个sceneInit来处理你对场景的任何需求。