在Swift

时间:2018-09-13 09:37:57

标签: objective-c swift class subclass base-class

我在目标c中有一个具有便捷功能的UIBaseClassViewController类,现在我切换到swift,并且试图将其代码转换为swift。该功能给我带来的问题是

+(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。它可以很好地加载笔尖,但是由于对象无法访问UILoginViewController中的函数,因此该对象崩溃了,因为UIBaseClassViewController应用程序崩溃。

如何使它创建子类的对象而不是父类。在这种情况下,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()

2 个答案:

答案 0 :(得分:0)

您必须在所需的视图控制器类上调用此静态函数,或者根本不使其变为静态。请参见下面的示例,以了解它在Swift中的工作方式。

class ParentView: UIView {
    static func printSelf() {
        print(String(describing: self))
    }
}
class ChildView: ParentView {}

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

答案 1 :(得分:0)

结果是我们不需要为控制器对象提到笔尖和束...我从目标c搬到了那里,这些东西是必需的。

使用

[[UILoginViewController alloc] init] 

应用程序将显示黑屏。

我们很快就可以使用UILoginViewController(),它将自动将nib与控制器对象相关联。

所以要回答我刚才使用的问题

self.init()

代替

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