self class 为 Swift 中等效的控制器分配

self class alloc for controllers equivalent in Swift

我有一个 class UIBaseClassViewController,在 objective 中有方便的功能 c.Now 我正在切换到 swift 并且我正在尝试将它的代码转换成 swift.the 给我问题的函数是

+(UIBaseClassViewController*)getController
{
   return [[[self class] alloc] initWithNibName:NSStringFromClass([self class]) bundle:[NSBundle mainBundle]];
}

我可以转换它,但效果不佳

static func getController() -> Self
{
    print("sam controller class = \(String(describing:self))")
    print("SAM controller = \(self.init(nibName: String(describing:self), bundle:Bundle.main))")

    return self.init(nibName: String(describing:self), bundle:Bundle.main)
}

输出:

sam controller class = UILoginViewController
SAM controller = <Swift_And_Node.UIBaseClassViewController: 0x7f8a4ee13830>

创建的对象类型 UIBaseClassViewController.it 可以很好地加载笔尖,但由于对象是 UIBaseClassViewController 应用程序崩溃,因为它无法在 UILoginViewController 中的 UIBaseClassViewController 中找到函数。

如何让它创建子对象 class 而不是 parent.UILoginViewController 在这种情况下

为了更好地理解显示添加代码:

UIBaseClassViewController:

class UIBaseClassViewController: UIViewController {
static func getController() -> Self
{
    print("sam controller class = \(String(describing:self))")
    print("SAM controller = \(self.init(nibName: String(describing:self), bundle:Bundle.main))")
    var object = self
    return self.init(nibName: String(describing:self), bundle:Bundle.main)
}
}

UILoginViewController:

class UILoginViewController: UIBaseClassViewController {}

需要 UILoginViewController 的第三个控制器:

UILoginViewController.getController()

您要么必须在所需的视图控制器上调用此静态函数 class,要么根本不将其设为静态。请查看下面的示例,了解它在 Swift.

中的工作原理
class ParentView: UIView {
    static func printSelf() {
        print(String(describing: self))
    }
}
class ChildView: ParentView {}

ParentView.printSelf() // Prints ParentView
ChildView.printSelf() // Prints ChildView

原来我们不需要为控制器对象提及 nib 和 bundle...我从 objective c 搬过来,这些东西在那里是必需的。

[[UILoginViewController alloc] init] 

应用会黑屏。

在swift中,我们可以只使用 UILoginViewController(),它会自动将 nib 与控制器对象相关联。

所以为了回答我的问题,我刚刚使用了

self.init()

而不是

self.init(nibName: String(describing:self), bundle:Bundle.main)