在"class func"方法中获取Swift类名

Osc*_*uez 18 static class function ios swift

我在Swift中有一个静态方法

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

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

self.dynamicType
Run Code Online (Sandbox Code Playgroud)

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

And*_*rea 13

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

@objc(BaseAsyncTask)

class BaseAsyncTask: WebServiceClient {
      class func execute(content : [String:AnyObject], cancelled:CustomBool)
      {
            println("Class \(NSStringFromClass(self))")
      }
}
Run Code Online (Sandbox Code Playgroud)

对于纯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!
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Ant*_*nio 10

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

let className = "\(self)"
Run Code Online (Sandbox Code Playgroud)

示例代码:

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"
Run Code Online (Sandbox Code Playgroud)


Bru*_*lho 7

另一种方法是,当你没有这个类的实例时就是这样.

斯威夫特4

print(String(describing:BaseAsyncTask.self))
Run Code Online (Sandbox Code Playgroud)

斯威夫特2

print(String(BaseAsyncTask))
Run Code Online (Sandbox Code Playgroud)

灵感来自这里.

在Swift中获取对象的类名作为字符串