Ios 强制类型转换类型在泛型函数作用域中不起作用。为什么?

Ios 强制类型转换类型在泛型函数作用域中不起作用。为什么?,ios,swift,xcode,generics,casting,Ios,Swift,Xcode,Generics,Casting,我在我的项目中做了一个类路由器(UINavigationController的子类),用于集中和最小化用于实例化和在视图之间导航的代码。但是,当我尝试最小化某个特定函数(buildView)时,类型转换不起作用。但是,这在功能范围buildView之外工作得很好,与一样功能中的操作员goHome enum Routes { case home case account var file: String { switch self { c

我在我的项目中做了一个类路由器(UINavigationController的子类),用于集中和最小化用于实例化和在视图之间导航的代码。但是,当我尝试最小化某个特定函数(
buildView
)时,类型转换不起作用。但是,这在功能范围
buildView
之外工作得很好,与
一样功能中的操作员
goHome

enum Routes {
    case home
    case account

    var file: String {

        switch self {
        case .home:
            return "HomeView"
        case .account:
            return "AccountView"
    }
}

protocol HomeInterface: class {

    func goTo(view: Routes)
    func showModal(view: Routes, caller: UIViewController)
}

class HomePresenter: NSObject, HomeInterface {
    init(view: HomeViewInterface) {

        self.view = view
    }
    internal func goTo(view: Routes) { /* Implementation */ }
    internal func showModal(view: Routes, caller: UIViewController) {/* Implementation */ }
}


protocol HomeViewInterface: class { 
/* Implementation */
}

class HomeViewController: UIViewController, HomeViewInterface {

        var presenter: HomeInterface?

        override func viewDidLoad() {
            super.viewDidLoad()
        }
    /* Implementation */
}
工作代码

    func goHome() {

        let viewInstance = buildView(view.file, HomeViewController.identifier, HomeViewController.self)

        viewInstance.presenter = HomePresenter(view: viewInstance)
        self.view?.pushViewController(viewInstance, animated: true)
    }

    private func buildView<T>(_ nameFile: String, _ identifier: String, _ viewClass: T.Type) -> T {

        return UIStoryboard(name: nameFile, bundle: nil).instantiateViewController(withIdentifier: identifier) as! T
    }
func goHome(){
让viewInstance=buildView(view.file、HomeViewController.identifier、HomeViewController.self)
viewInstance.presenter=HomePresenter(视图:viewInstance)
self.view?.pushViewController(viewInstance,动画:true)
}
private func buildView(u-nameFile:String,u-identifier:String,uu-viewClass:T.Type)->T{
将UIStoryboard(名称:nameFile,bundle:nil)返回为!T
}
所需的最终代码,但不起作用:

func goHome() { 
    buildViewFinal(view.file, HomeViewController.identifier, HomeViewController.self)
}

func buildViewFinal<T, P>(_ nameFile: String, _ identifier: String, viewClass: T, presenter: P) {

    let viewInstance = UIStoryboard(name: nameFile, bundle: nil).instantiateViewController(withIdentifier: identifier) as? T

    viewInstance.presenter = P(view: viewInstance)
    self.view?.pushViewController(viewInstance, animated: true)
}
func goHome(){
buildViewFinal(view.file、HomeViewController.identifier、HomeViewController.self)
}
func buildViewFinal(uName文件:字符串,UIdentifier:字符串,viewClass:T,presenter:P){
让viewInstance=UIStoryboard(名称:nameFile,bundle:nil)。实例化eViewController(标识符:identifier)为?T
viewInstance.presenter=P(视图:viewInstance)
self.view?.pushViewController(viewInstance,动画:true)
}
当我尝试将代码最小化到
buildViewFinal
函数时,
viewInstance
的属性
presenter
无法识别,显示编译错误

类型为“T”的值没有成员“presenter”

,并在
pushViewController
中显示错误:

无法将类型“T”的值转换为所需的元素类型 “UIViewController”

主要目标是使所有代码都变得有用和简单


那么,这如何在第一段代码中运行良好,但在第一段代码中无法识别
buildViewFinal
范围内的类型呢,您正在将
HomeViewController.self
作为
viewClass
传递,因此它知道
buildViewFinal
将返回
HomeViewController
的实例,并且
HomeViewController
具有
presenter
属性

在第二个代码段中,编译器对
t
一无所知,因此不能假定它将具有
presenter
属性

您可以使用类型约束强制执行
T
HomeViewController
或定义
presenter
属性的任何类:

func buildViewFinal<T: HomeInterface, P>(_ nameFile: String, _ identifier: String, viewClass: T, presenter: P) {

    let viewInstance = UIStoryboard(name: nameFile, bundle: nil).instantiateViewController(withIdentifier: identifier) as? T

    viewInstance.presenter = P(view: viewInstance)
    self.view?.pushViewController(viewInstance, animated: true)
}
func buildViewFinal(u-nameFile:String,u-identifier:String,viewClass:T,presenter:P){
让viewInstance=UIStoryboard(名称:nameFile,bundle:nil)。实例化eViewController(标识符:identifier)为?T
viewInstance.presenter=P(视图:viewInstance)
self.view?.pushViewController(viewInstance,动画:true)
}
但是,您将遇到一个问题,
viewInstance
无法推送,因为编译器不知道它是
UIViewController
子类的实例

实际上,泛型和协议只是让事情复杂化了


您处理的是面向类的UIKit,因此您最好只使用良好的旧继承

什么是presenter?viewInstance.presenter的类型是什么?您可以显示该类型的声明吗?Presenter声明addedenum
Routes
addedWhich类定义了
Presenter
属性?谢谢!这种方法很好。我会重新考虑你的观察。