2016-03-23 3 views
0

Я хотел бы создать экземпляр объекта с заданным типом. Вот вызов функции:Как создать экземпляр объекта с заданным типом

buildObjetFromType("data", typeClass: User.self) 

Вот код функции:

public static func buildObjectFromType<T>(data: String, typeClass: T.Type) -> T{ 

    print(typeClass) // will print "User" 
    var object:T? 

    object as! T.Type // cast the object into an User -> NOT WORKING ! 

    // fill the object with the data, knowing 
    // return the object once it has been filled with the data. 
} 

вот мой класс User:

public class User { 
    private var id:String? 
    private var login:String? 
    private var pwd:String? 
    private var nom:String? 
    private var prenom:String? 

    public required init(){ 
     id = "" 
     login = "" 
     pwd = "" 
     nom = "" 
     prenom = "" 
    } 

    public convenience init(_login: String, _pwd: String){ 
     self.init() 
     login = _login 
     pwd = _pwd 
    } 

    public convenience init(_id: String, _login: String, _pwd: String, _nom: String, _prenom: String){ 
     self.init(_login: _login, _pwd: _pwd) 
     id = _id 
     nom = _nom 
     prenom = _prenom 
    } 
} 
+0

Где вы создаете объект? 'var object: T?' возвращает только 'nil'. Вам нужно вызвать метод 'init' где-нибудь. – vadian

+0

ну, экземпляр, который, я считаю, будет «объектом как! T.Type», или я не прав? T.init() не будет работать, так как он не знает, что такое «T» –

ответ

2

См: Instantiate an object of a generic type in Swift

Предполагая, что все классы, хотите создать экземпляр, иметь требуемый инициализатор без аргументов (вы можете захотеть, чтобы они наследовали fr om того же базового класса и добавьте это требование в свою функцию), вы можете сделать следующее:

static func instantiate<T where T: BaseClass>(data: String, cls: T.Type) -> T { 
    let obj = T() 
    // do something with obj and data 
} 
+0

Вы должны пометить этот вопрос как дубликат, а не публиковать дублированный ответ другого вопроса о переполнении стека. – JAL

+0

Предположим, что это возможность, как я могу назвать подкласс моего BaseClass? –