在“class func”方法中获取Swift类名

18

我在Swift中有一个静态方法

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

我想知道如何在这个方法中获取类名。我尝试过

self.dynamicType

但是这会导致错误(我猜测是因为类函数内部的自身引用)

3个回答

13

有不同的方法可以做到这一点,如果你的方法继承自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版本中这段代码会显示警告。为了避免这种情况,我们应该像这样给方法加前缀:

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

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

NSStringFromClass(self).componentsSeparatedByString(".").last! 很好用。没有想到可以尝试不用dynamicType的self,谢谢。 - Oscar Vasquez
@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! } - Alex

10

您可以使用字符串插值来打印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"

哇!太棒了,这是个很好的解决方案。 - Oleg

7

1
这在Swift 4中不起作用。你需要使用类似这样的东西:String(describing:BaseAsyncTask.self) - ThomasW

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