【问题标题】:Get Swift class name in "class func" method在“class func”方法中获取 Swift 类名
【发布时间】:2015-10-26 06:54:50
【问题描述】:

我在 Swift 中有一个静态方法

class BaseAsyncTask: WebServiceClient {
      class func execute(content : [String:AnyObject], cancelled:CustomBool)
      {
            // Print class name (BaseAsyncTask) here
      }
}

我想知道如何在该方法中获取类名。我试过了

self.dynamicType

但这会产生错误(我想是因为类函数中的 self)

【问题讨论】:

    标签: ios swift function class static


    【解决方案1】:

    有不同的方法可以做到这一点,如果你的方法继承自 NSObject,你可以将它暴露给 Objective-c 并做类似的事情。

    @objc(BaseAsyncTask)
    
    class BaseAsyncTask: WebServiceClient {
          class func execute(content : [String:AnyObject], cancelled:CustomBool)
          {
                println("Class \(NSStringFromClass(self))")
          }
    }
    

    对于纯粹的 SWIFT 内省,请在此处查看 MirrorType

    我还发现此扩展名归功于 ImpactZero

    public extension NSObject{
        public class var nameOfClass: String{
            return NSStringFromClass(self).components(separatedBy: ".").last!
        }
    
        public var nameOfClass: String{
            return NSStringFromClass(type(of: self)).components(separatedBy: ".").last!
        }
    }
    

    [Xcode 8]
    Alex 建议我在 Xcode 8 版本中此代码显示警告。为了避免这种情况,我们应该像这样为方法添加前缀:

    @nonobjc class var className: String{ 
       return NSStringFromClass(self).components(separatedBy: ".").last!
    }
    

    【讨论】:

    • NSStringFromClass(self).componentsSeparatedByString(".").last!作为一种魅力。我没想到不用dynamicType就可以尝试self,谢谢。
    • @Andrea,我还建议在public class var nameOfClass 之前添加@nonobjc 属性以避免以下警告(Xcode 8.2):“ld:警告:某些目标文件具有不兼容的 Objective-C 类别定义. 某些类别元数据可能会丢失。所有包含 Objective-C 类别的文件都应使用相同的编译器构建。像这样:@nonobjc class var className: String{ return NSStringFromClass(self).components(separatedBy: ".").last! }
    【解决方案2】:

    可以使用字符串插值来打印self

    let className = "\(self)"
    

    示例代码:

    class BaseAsyncTask: WebServiceClient {
        class func execute(content : [String:AnyObject], cancelled: CustomBool)
        {
            let className = "\(self)"
            print(className)
        }
    }
    
    class AnotherAsyncTask : BaseAsyncTask {
    }
    
    BaseAsyncTask.execute([:], cancelled: true) // prints "BaseAsyncTask"
    AnotherAsyncTask.execute([:], cancelled: true) // prints "AnotherAsyncTask"
    

    【讨论】:

    • 哇!很好的解决方案。
    【解决方案3】:

    当你没有类的实例时,另一种方法是 this。

    斯威夫特 4

    print(String(describing:BaseAsyncTask.self))
    

    斯威夫特 2

    print(String(BaseAsyncTask))
    

    灵感来自这里。

    Get class name of object as string in Swift

    【讨论】:

    • 这在 Swift 4 中不起作用。你需要使用类似:String(describing:BaseAsyncTask.self)
    猜你喜欢
    • 2015-10-10
    • 2020-03-13
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多