在Swift中获取UIViewController的类名

59

如何在Swift中获取UIViewController类的类名?

在Objective-C中,我们可以这样做:

self.appDelegate = (shAppDelegate *)[[UIApplication sharedApplication] delegate];
    UIViewController *last_screen = self.appDelegate.popScreens.lastObject ;
    
    if(last_screen.class != self.navigationController.visibleViewController.class){

    //.......
}

但是在 Swift 中我尝试了:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let last_screen = appDelegate.popScreens?.lastObject as UIViewController

无法完成此操作。

if last_screen.class != self.navigationController.visibleViewController.class {

//....

}

UIViewController没有class方法,即最后一个屏幕。

11个回答

77

要知道您的类名,可以调用类似以下代码:

var className = NSStringFromClass(yourClass.classForCoder)

它返回 <project_name>.<class_name>,但在大多数情况下用户只需要第二部分。 - Gargo

63

不需要知道你的类名,最干净的方法是这样的。

let name = String(describing: type(of: self))

44

在 Swift 3 中,一个简单的方法是编写以下代码:

例如:

let className = String(describing: self)

对于类:

let className = String(describing: YourViewController.self)

请注意,例如 String(describing: UIViewController()) 将输出 <UIViewController: 0x141d0f7e0>,而 String(describing: type(of: UIViewController())) 只会输出 UIViewController - shim

20

在 juangdelvalle 的 答案 上进行拓展。

我将其添加为扩展,从而使其可重用且更易于从任何视图控制器中调用。同时,在某些情况下,在 Swift 中使用 NSStringFromClass 返回的字符串格式如下:

< 项目名称 >.viewControllerClassName

此扩展属性已修改以除去项目名称前缀并仅返回类名。

extension UIViewController {
    var className: String {
        NSStringFromClass(self.classForCoder).components(separatedBy: ".").last!
    }
}

当你说“在某些情况下”时,你的意思是它不能返回一致的答案吗? - Craig.Pearce
实际上,点号前的第一部分是模块名称。因此,如果您的类在外部库中定义,您将看到模块名称。然而,最后一部分应该是真正的类名。除非苹果出于某种原因决定更改此函数。 - Dunbar
为什么不直接使用以下代码?let viewControllerName = "\(viewControllerInstance.classForCoder())" - Noor

8

Swift 4

假设我们有一个名为HomeViewController的类。那么你可以使用以下代码获取类的名称:

let class_name = "\(HomeViewController.classForCoder())"
classForCoder()方法返回AnyClass对象(您的类名),我们将其转换为字符串供用户使用。

7
这是isuru答案的swift3版本。
extension UIViewController {
    var className: String {
        return NSStringFromClass(self.classForCoder).components(separatedBy: ".").last!;
    }
}

2
末尾多了一个 ';'。 - alasker
2
我猜我内心并不是一名Swift开发者。 - zingle-dingle

5

Swift 5 解决方案:

extension NSObject {
  var className: String {
    return String(describing: type(of: self))
  }

  class var className: String {
    return String(describing: self)
  }
}

使用方法:

class TextFieldCell: UITableVIewCell {
}

class LoginViewController: UIViewController {
  let cellClassName = TextFieldCell.className
}

3
在Swift 5.1中,我们还可以使用String(describing: Self.self)

2

使用String.init(describing: self.classForCoder)

例子:

let viewControllerName = String.init(describing: self.classForCoder)
print("ViewController Name: \(viewControllerName)")

1
在Swift中,该属性被称为dynamicType

注意:这个属性在一段时间前已被弃用,而且在最新的Swift中已经完全被淘汰。 - shim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接