ios - create - swift final class
Obtenga el nombre de la clase Swift en el método "class func" (3)
Tengo un método estático en Swift
class BaseAsyncTask: WebServiceClient {
class func execute(content : [String:AnyObject], cancelled:CustomBool)
{
// Print class name (BaseAsyncTask) here
}
}
Y quiero saber cómo obtener el nombre de la clase dentro de ese método. Lo intenté
self.dynamicType
pero eso da error (supongo que debido a uno mismo dentro de una función de clase)
Existen diferentes métodos para hacerlo, si su método se hereda de NSObject, puede exponerlo al objetivo-c y hacer algo así.
@objc(BaseAsyncTask)
class BaseAsyncTask: WebServiceClient {
class func execute(content : [String:AnyObject], cancelled:CustomBool)
{
println("Class /(NSStringFromClass(self))")
}
}
Para la introspección de SWIFT pura, consulte aquí sobre MirrorType
He encontrado también esta extensión de créditos para 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 me sugirió que en la versión Xcode 8 este código muestra una advertencia. Para evitar eso deberíamos prefijar el método así:
@nonobjc class var className: String{
return NSStringFromClass(self).components(separatedBy: ".").last!
}
Otra forma de hacer esto, cuando no tienes una instancia de la clase es esta.
Swift 4
print(String(describing:BaseAsyncTask.self))
Swift 2
print(String(BaseAsyncTask))
Inspirado aquí.
Puede utilizar la interpolación de cadenas para imprimir self
:
let className = "/(self)"
Código de muestra:
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"