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)
我有一个 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)