2015-08-04 14 views
17

Mam statycznej metody w SwiftGet Swift nazwę klasy w "class func" metody

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

I chcę wiedzieć, jak uzyskać nazwę klasy wewnątrz tej metody. Próbowałem

self.dynamicType 

ale daje błąd (przypuszczam, ze względu na siebie wewnątrz funkcji klasy)

Odpowiedz

11

Istnieją różne metody, aby to zrobić, jeśli metoda dziedziczy z NSObject można narażać go na objective- c i zrób coś takiego.

@objc(BaseAsyncTask) 

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

do czystej SWIFT introspekcji sprawdzanie o MirrorType

Znalazłem też to rozszerzenie kredytów do 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 zasugerował mi, że w Wersja Xcode 8 ten kod pokazuje ostrzeżenie. Aby tego uniknąć należy poprzedzić metoda tak:

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

NSStringFromClass (self) .componentsSeparatedByString (""). Ostatni! pracował jako urok. Nie przyszło mi do głowy, aby wypróbować self bez dynamicType, dziękuję. –

+0

AWASOME! dzięki :) –

+0

@Andrea, Proponuję również dodać atrybut '@ nonobjc' przed' public class var nameOfClass' aby uniknąć następującego ostrzeżenia (Xcode 8.2): "ld: warning: Niektóre pliki obiektów mają niekompatybilną kategorię Objective-C Definicje Niektóre metadane kategorii mogą zostać utracone Wszystkie pliki zawierające kategorie Cel-C powinny być zbudowane przy użyciu tego samego kompilatora. " Podobnie jak w przypadku: '@nonobjc class var className: String {return NSStringFromClass (self) .components (separatedBy:". "). Last! } ' – Alex

8

Można użyć interpolacji ciąg wydrukować self: kod

let className = "\(self)" 

próbki:

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" 
+0

Wow! Świetne rozwiązanie. – Oleg

6

Innym sposobem, aby to zrobić, kiedy nie masz instancji klasy, to jest to.

Swift 4

print(String(describing:BaseAsyncTask.self)) 

Swift 2

print(String(BaseAsyncTask)) 

Zainspirowany tutaj.

Get class name of object as string in Swift

+1

To nie działa w Swift 4. Musisz użyć czegoś takiego: 'String (opis: BaseAsyncTask.self)' – ThomasW

+0

Edytowane, dziękuję! –