2015-07-27 3 views
-1

Я пытаюсь создать экземпляр класса с использованием строки и передать его значение. Это ток, как я это делаю:Создание экземпляра класса с помощью строки

var scene = Level1(size: self.size) 

я должен был бы иметь что-то вроде этого:

var levelId = 1 
var scene = imaginaryFunction("Level\(levelId)", self.size) 
// scene should be an instance of Level1 class 

levelId++ 
var scene2 = imaginaryFunction("Level\(levelId)", self.size) 
// scene2 should be an instance of Level2 class 

levelId += 8 
var scene3 = imaginaryFunction("Level\(levelId)", self.size) 
// scene3 should be an instance of class Level10 
+1

Ваш «LevelPresent1» - это класс, а не его экземпляр. Вы не можете «создать новый класс с помощью строки», вы можете создать новый экземпляр своего класса, используя строку, если ваш класс имеет инициализатор, который принимает строку в качестве аргумента. – milo526

+0

Нет ... это не то, что я пытаюсь сделать. Я хочу определить класс для создания с помощью строки. Например, у меня есть классы '' Level1'', 'Level2'' и' 'Level3'', и я хочу назначить экземпляр одного из этих классов для' 'var scene'', но я хочу определить, какой из эти 3 класса для выбора с помощью строки. – Heriotza

+0

Я бы пошел на использование оператора Switch, включил строку и вернул класс – milo526

ответ

1

Вы можете попробовать следующее, но он не может предложить какое-либо преимущество над Свифта общие и протоколы:

// This protocol defines the common initializer for all Level classes 
protocol MyLevelProtocol { 
    init (size : Int) 
} 

@objc(Level1) // This defines the ObjC name of the class. Needed for NSClassFromString 
class Level1 : MyLevelProtocol { 
    required init (size : Int) { 
     // Do your init 
    } 
} 

@objc(Level2) 
class Level2 : MyLevelProtocol { 
    required init (size : Int) { 
     // Do your init 
    } 
} 

func getLevelFromString(levelName : String, size : Int) -> AnyObject? { 
    if let levelClass = NSClassFromString(levelName) as? MyLevelProtocol.Type { 
     return levelClass.init(size: size) as? AnyObject 
    } else { 
     // Level not found 
     return nil 
    } 
} 

let scene1 = getLevelFromString("Level1", size: 1) 
let scene2 = getLevelFromString("Level2", size: 4) 
+0

Зачем возвращать 'AnyObject'? вы должны просто оставить его как 'MyLevelProtocol' – newacct

Смежные вопросы