Domanda Ottieni una versione leggibile dall'utente del nome della classe in swift (in objc NSStringFromClass andava bene)


Esiste un equivalente di NSStringFromClass in Swift che fornisce una versione leggibile dall'utente del nome della classe? Ho provato ad usarlo con una classe Swift nativa che ho creato, ma come potete vedere, il risultato sembra essere la rappresentazione interna del nome della classe del compilatore:

println(NSStringFromClass(MyClass.self))

Risultato:

_TtC5test7MyClass

Ho provato ad aggiungere il @objc attributo alla classe e rendendolo una sottoclasse di NSObject, ma non fa alcuna differenza. Ho scoperto che se sostituisco MyClass con una classe Objective-C con lo stesso nome, e l'ho importato nell'intestazione del bridging, mi dà "MyClass", ma questo non dovrebbe essere necessario.

Un'altra opzione sarebbe quella di creare un protocollo per questo, che ogni classe che voglio usare in questo modo deve essere conforme a:

protocol Nameable {
    class var className: String { get }
}

Tuttavia, sarebbe più facile avere un modo integrato per farlo nella lingua.


25
2018-06-08 15:25


origine


risposte:


nuovo formato basato su xcode 6 beta 5.

(Project_name). (Class_name)

func getName(classType:AnyClass) -> String {

    let classString = NSStringFromClass(classType.self)
    let range = classString.rangeOfString(".", options: NSStringCompareOptions.CaseInsensitiveSearch, range: Range<String.Index>(start:classString.startIndex, end: classString.endIndex), locale: nil)
    return classString.substringFromIndex(range!.endIndex)
}

Ultimo 6.3 Xcode Swift 1.2

se hai bisogno di un'estensione o puoi metterla su qualsiasi oggetto comune:

public extension NSObject{
    public class var nameOfClass: String{
        return NSStringFromClass(self).componentsSeparatedByString(".").last!
    }

    public var nameOfClass: String{
        return NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
    }
}

25
2017-08-04 23:17



Ora puoi solo fare:

String(MyClass)

60
2018-01-15 00:00



Swift 3

type(of: self)  stampe ModuleName.ClassName


10
2017-12-17 06:46



Al momento, non esiste un modo affidabile per farlo. Vedi il commento di uno sviluppatore Apple https://devforums.apple.com/thread/227425 

Swift attualmente non ha molto in termini di introspezione.

C'è un macchinario di introspezione che viene usato per   campi da gioco. Non so se è destinato ad essere API.

Alcuni Swift   metodi e variabili possono essere esaminati utilizzando il runtime Objective-C   introspezione. Probabilmente è la soluzione migliore oggi.

Swift ha la nozione di un metatipo, in qualche modo analogo al tipo di classe nell'obiettivo C. Puoi trovarlo usando TypeName.self, per esempio.:

class Foo {
    @required  init() {
    }
}

var normalFoo : Foo = Foo()
var fooType : Foo.Type = Foo.self;
var fooFromMetatype : Foo = fooType();

Forse, per tempo di rilascio, i metatipi includeranno più abilità di introspezione. Suggerisco di presentare una richiesta di funzionalità radar per questo.


5
2018-06-08 15:49



In Swift 2 beta 4 puoi accedere alle informazioni tramite l'oggetto tipo:

let className = "\(String.self)"   // gives: "Swift.String"

o se hai un'istanza:

let s = "Hello World"
let className = "\(s.dynamicType)" // gives: "Swift.String"

Ottieni il risultato Module.Class, come:

Swift.String
ABC.MyGenericClass<Swift.Int>

Abbastanza divertente l'oggetto Tipo restituito non sembra conforme al protocollo CustomStringConvertible. Quindi non ha una proprietà 'description', sebbene il modello "" faccia ancora la cosa giusta.

P.S .: Prima di b4 lo stesso potrebbe essere ottenuto tramite reflect (obj.dynamicType) .summary.


5
2018-06-25 12:43



In Swift v3.0, questo ha funzionato per me:

String.init(describing: self.self)

3
2017-10-05 17:35



Se vuoi avere solo il nome della classe in swift puoi analizzare la stringa restituita da NSStringFromClass ().

Questo è fatto in nameOfClass.swift del repository Gishub di INSwift: https://github.com/indieSoftware/INSwift


1
2018-06-18 12:14



Ora sei in grado di usare quanto segue per recuperare il nome della classe in swift

let nameSpaceClassName = NSStringFromClass(RWTCountryPopoverViewController.self)
let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String

1
2018-02-06 22:13