swift - 解析符合协议(protocol)的类和对象

标签 swift reflection dependency-injection swinject

我想传递一个符合某些协议(protocol)的对象,并使用 Swinject framwork 解析其分配类型(通过依赖注入(inject))。

protocol IViewModelAware {
    typealias T
    var viewModel : T { get set }
}


class ViewAndViewModelCreator {
    var container : Container

    init(container : Container) {
        self.container = container
    }

    func resolveViewModel<T : IViewModelAware>(controller : T) {
        let mirror = Mirror(reflecting: controller.viewModel)
        let viewModelClassType = mirror.subjectType
        let viewModel = self.container.resolve(viewModelClassType.self) // This line shows error
        controller.viewModel = viewModel
    }

}

错误: 无法使用类型为“(Any.Type)”的参数列表调用“resolve”

如何从确认协议(protocol)的对象中获取类,也许除了反射之外还有其他选择?

最佳答案

您可以通过 controller.viewModel.dynamicType 从其实例中获取 View 模型类的类型:

func resolveViewModel<T : IViewModelAware>(controller : T) {
    let viewModel = container.resolve(controller.viewModel.dynamicType)
    // ...
}

关于swift - 解析符合协议(protocol)的类和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34289989/

相关文章:

swift - 在 Swift3 中用逗号对数字运行操作

c# - 我可以将 Activator.CreateInstance 与接口(interface)一起使用吗?

logging - 如何使用 Simple Injector 配置 NLog 生活方式?

java - Apache Camel 与构造函数注入(inject)

c# - 修改内部 .NET 类的方法实现

java - Jersey 2.22 : Where should I define the location of REST resources?

ios - 如何从委托(delegate)和数据源类访问 Collection View ?

swift - 如何在终端中使用 Swift 关闭本地服务器连接?

ios - 尝试通过点击 UIBarButtonItem 进行共享时 iPad 崩溃

c# - 如何创建具有参数和私有(private)类型返回类型的快速调用委托(delegate),加速 DynamicInvoke