Получить имя класса Swift в методе "класс func"

У меня есть статический метод в Swift

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

И я хочу знать, как получить имя класса внутри этого метода. Я попробовал

self.dynamicType

но это дает ошибку (я полагаю, из-за себя внутри функции класса)

Ответы

Ответ 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]
Алекс предложил мне, что в версии Xcode 8 этот код показывает предупреждение. Чтобы избежать этого, мы должны префикс метода следующим образом:

@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"