Swift: integer load level class

I am making a Swift game with a lot of levels. Each level is in a file with sequential names:

Level1.swift
Level2.swift
Level3.swift
...

And each file has one class in it, and the class name matches the file name.

The reason that everything is a class is because all classes use similar functions from the base class, and also because of the large number of common variables.

The problem is that I don’t know how to load a level, just using an integer without doing this kind of disaster:

switch Int(level)! {
  case 1:
    newScene = Level1(size: frame.size)
  case 2:
    newScene = Level2(size: frame.size)
  case 3:
    newScene = Level3(size: frame.size)
  ...

SKScene(fileNamed:), - .sks, . , , , - Bundle.main.url - . , . .

+4
2

String , , , .

import Foundation

class Level  {
    required init() {}
}

class Level1 : Level {
     required init() {
        print("Created Level 1")
    }
}
class Level2 : Level {
    required  init() {
        print("Created Level 2")
    }
}

var myLevelClassRealName = NSStringFromClass(Level.self)
print("This String is what we need : \(myLevelClassRealName)")

var level = 2
print("The Level I want to load is Level # \(level)")
myLevelClassRealName = myLevelClassRealName + "\(level)"
print("Real name for my class is   : " + myLevelClassRealName)

let myLookupClass = NSClassFromString(myLevelClassRealName) as! Level.Type
let currentLevel = myLookupClass.init()

print("Created a class of type     : \(type(of: currentLevel))")

:

: TempCode.Level

, , - # 2

: TempCode.Level2

2

: Level2

+1

, "" , Swift. , , ObjC:

NSObject ( ):

class Level : NSObject {
    var levelId: Int = 0

    required init(size: NSSize) { }
    // all other common stuffs here
}

class Level1 : Level {
    required init(size: NSSize) {
        super.init(size: size)
        self.levelId = 1
        // ...
    }
}

class Level2 : Level {
    required init(size: NSSize) {
        super.init(size: size)
        self.levelId = 2
        // ...
    }
}

class Level3 : Level {
    required init(size: NSSize) {
        super.init(size: size)
        self.levelId = 3
        // ...
    }
}

, :

let levelId = 2

// Module Name = Product Name from your Build Settings, unless you put
// the Level classes into sub-namespace
let className = "ModuleName.Level\(levelId)"    

let LevelClass = NSClassFromString(className) as! Level.Type

// At build time, the compiler sees this as an object of type Level,
// but it actually a Level2 object. You can cast it to Level2 if
// you need to do something specific to that level.
let level = LevelClass.init(size: frame.size)       
+2

Source: https://habr.com/ru/post/1679094/


All Articles