2014-12-06 89 views
0

我试图从一个传递给我的函数的类创建一个对象。问题是我无法传递任何参数给它的构造函数,因为我看不到initialize这个类有参数。带参数的Swift类型反射初始化

这是我的代码至今:

class func invokeService<T: Initable>(service: String, returningClass: T.Type, completionHandler handler: ((T) ->())) { 

     var interfaceObject = returningClass() 

     interfaceObject.self(data: service as Dictionary <String, AnyObject>) 

     handler(interfaceObject) 
    } 

这是错误我得到:

'(data: Dictionary <String, AnyObject>)-> $T2' is not identical to 'T' 

回答

1

一些奇怪的事情在你的代码是怎么回事,就我所看到的(我也不是Swift专家)。具体而言,您正试图两次初始化相同的对象。

我假设你Initable协议被定义为:

protocol Initable { 
    init(data:Dictionary <String, AnyObject>) 
} 

而且你想从实例化一个对象。那么正确的方式做这将是:

class func invokeService<T: Initable>(service: String, returningClass: T.Type, completionHandler handler: ((T) ->())) { 

    var dict = // create a Dictionary <String, AnyObject> 
    var interfaceObject = returningClass(data: dict) 

    handler(interfaceObject) 
} 

现在你剩下的问题是如何将service转换成字典。出于显而易见的原因,您不能简单地将字符串转换为字典。

你想看看this answer以及另一个问题。迂腐的笔记:使用动态打字和初始化一个这样的匿名类是非常先进的用法,应该只在非常极端的情况下才需要。通常,Abstract Factory Pattern是实现类似目标的更好方式。