带参数的Swift类型反射初始化

时间:2014-12-06 13:33:57

标签: ios iphone swift initialization

我正在尝试从传递给我的函数的类创建一个对象。问题是我无法将任何参数传递给它的构造函数,因为我似乎不能initialize带参数的类。

这是我到目前为止的代码:

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 个答案:

答案 0 :(得分: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是实现类似目标的更好方法。