get-class-name-swift-ios12

用代码获取类名

很多时候我们都需要通过代码获取当前类或者某个类的类名

背景

在之前已经有的代码中, 很简单的, 我们直接使用

  • 类/静态 函数调用的话: String(description: self)
  • 实例调用的话: String(description: type(of: self))

这在之前, 还是能好好玩耍的嗯…知道 iOS12 出来放大招…(我也不确定是不是 iOS12的问题或者是新版本 XCode 编译打包的问题…反正为了暗黑模式升级后就出问题了…然而竟然没有暗黑模式….不过也是先踩了个坑也好的说…)

原因

当你使用Bundle.main.loadNibNamed(self.className, owner: self, options: nil)(对应的 className 就是通过上面的函数获取的)
的时候, 嗯..我们是通过一个字符串去加载对应的 xib, 本来是 work 的, 但是现在问题出现了. 获取到的带了当前的 Bundle 名, 也就是说, 本来是class A, 当前的项目 Target 是 XXX(基本就是你的项目名), 的出来的结果是…XXX.A, 不再是之前的A.

所以…我们就需要适配这种变化.

方案

这里, 我们将这个获取当前类名的方法改成下面这样:

1
2
3
public func nibName() -> String {
return type(of: self).description().components(separatedBy: ".").last!
}

通过将的到的String 再用"."分割, 获取最后一个, 即使没有".", 我们也能拿到原来的 String.

为什么是改成nibName,
一个是当前已经有 className 的函数, 不好去和他冲突.
二是当前发现的问题是在获取 xib 的名字上, 限定在这个范围能减少很多副作用.

但是按参考博客里面说的, 好像是所有的对象类都会有这样的, 所以你一开始定义时是可以直接将这个方法对 NSObject 进行扩展


ref:
Get class name in Swift
Custom UIView with XIB file