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

标签 ios iphone swift initialization

我正在尝试从传递到我的函数的类中创建一个对象。问题是我无法将任何参数传递给它的构造函数,因为我似乎无法使用参数初始化类。

这是我目前的代码:

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'

最佳答案

据我所知(我也不是 Swift 专家),您的代码中发生了一些奇怪的事情。具体来说,您正在尝试对同一个对象进行两次初始化。

我假设您的 Initable 协议(protocol)定义为:

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是实现类似目标的更好方法。

关于ios - 带有参数的 Swift 类型反射初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332244/

相关文章:

ios - 如何围绕 UIStackView (iOS 9) 的中心均匀分布两个 subview ?

ios - 可拖动的 UIView Swift 3

iphone - 如何在 iphone 中通过触摸移动重新绘制已删除的图像

Swift 4 Firebase 在线状态更新

ios - 函数退出后不保留对数组的更改

ios - 在 @implementation 中使用 'self'

iphone - sqlite 语句中返回的行数

javascript - 点击按钮后如何激活iOS键盘专注于输入?

swift - 如何使用 Swift 在 Cocoa App 中设置 NSView 的颜色?

swift - 在使用 Swift 的应用程序收据验证中返回代码 21002