web-dev-qa-db-fra.com

Get Swift nom de classe dans la méthode "class func"

J'ai une méthode statique dans Swift

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

Et je veux savoir comment obtenir le nom de classe dans cette méthode. j'ai essayé

self.dynamicType

mais cela donne une erreur (je suppose à cause de l'auto dans une fonction de classe)

18
Oscar Vasquez

Il existe différentes méthodes pour le faire, si votre méthode hérite de NSObject, vous pouvez l'exposer à objective-c et faire quelque chose comme ça.

@objc(BaseAsyncTask)

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

Pour une pure Swift vérification de l'introspection ici sur MirrorType

J'ai également trouvé cette extension de crédits à 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 m'a suggéré que dans la version Xcode 8, ce code affiche un avertissement. Pour éviter cela, nous devons préfixer la méthode comme ça:

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

Vous pouvez utiliser l'interpolation de chaînes pour afficher self:

let className = "\(self)"

Exemple de code:

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"
10
Antonio

Une autre façon de le faire, lorsque vous n'avez pas d'instance de classe, est la suivante.

Swift 4

print(String(describing:BaseAsyncTask.self))

Swift 2

print(String(BaseAsyncTask))

Inspiré ici.

Obtenir le nom de classe de l'objet sous forme de chaîne dans Swift

7
Bruno Coelho