Obtendo o nome da classe de um objeto como String
usando:
object_getClassName(myViewController)
retorna algo como isto:
_TtC5AppName22CalendarViewController
Eu estou procurando a pura versão: "CalendarViewController"
. Como obtenho uma sequência limpa do nome da classe?
Encontrei algumas tentativas de perguntas sobre isso, mas não uma resposta real. Não é possível?
Respostas:
String de uma instância :
String de um tipo :
Exemplo:
Testado com
class
,struct
eenum
.fonte
String(describing: MyViewController.self)
conforme observado em algumas respostas abaixo.Foo
aFoo2
, mas criar uma classeFoo
em outro lugar, que freio força o código). No caso de subclassificação, você precisa usar umatype(of:)
ou mais,Type.self
dependendo da sua necessidade. Provavelmentetype(of:)
é mais apropriado para obter o nome da classe.ATUALIZADO PARA SWIFT 5
Podemos obter descrições bonitas de nomes de tipos usando a variável de instância através do
String
inicializador e criar novos objetos de uma determinada classeComo, por exemplo
print(String(describing: type(of: object)))
. Ondeobject
pode ser uma variável de instância como matriz, dicionário, anInt
, aNSDate
etc.Como
NSObject
é a classe raiz da maioria das hierarquias de classe Objective-C, você pode tentar fazer uma extensão paraNSObject
obter o nome da classe de cada subclasse deNSObject
. Como isso:Ou você pode criar uma função estática, cujo parâmetro é do tipo
Any
(O protocolo ao qual todos os tipos estão implicitamente em conformidade) e retorna o nome da classe como String. Como isso:Agora você pode fazer algo assim:
Além disso, uma vez que podemos obter o nome da classe como String, podemos instanciar novos objetos dessa classe :
Talvez isso ajude alguém por aí!
fonte
classNameAsString
pode ser simplificadoclassName
, pois esse "nome" implicava seu tipo.theClassName
é semelhante à história do facebook, chamada originalmente de thefacebook.ProjectTest.MyViewController
. Como faço para me livrar desse nome de projeto? Eu quero apenas o nome da classe.Swift 5
Aqui está a extensão para obter a
typeName
variável (trabalhe com o tipo de valor ou tipo de referência).Como usar:
fonte
Swift 3.0
String(describing: MyViewController.self)
fonte
type(of: )
é um exagero lá,String(describing: MyViewController.self)
será suficienteString.init(describing: MyViewController.self)
?init
é desnecessário.Sugiro tal abordagem ( muito Swifty ):
Ele não usa nem introspecção nem desmontagem manual ( sem mágica! ).
Aqui está uma demonstração:
fonte
type(of: self)
Se você digitar
Foo
, o código a seguir fornecerá o"Foo"
Swift 3 e o Swift 4:O problema com a maioria das respostas aqui é que elas fornecem
"Foo.Type"
a sequência resultante quando você não tem nenhuma instância do tipo, quando o que você realmente deseja é justo"Foo"
. A seguir"Foo.Type"
, como mencionado em várias outras respostas.A
type(of:)
peça é desnecessária se você apenas quiser"Foo"
.fonte
No Swift 4.1 e agora no Swift 4.2 :
Se você não tem uma instância por perto:
Se você tem uma instância em torno de:
fonte
Para obter o nome de uma classe Swift de um objeto, por exemplo, para o objeto var: SomeClass (), use
Para obter o nome de uma classe Swift de um tipo de classe, por exemplo, SomeClass, use:
Resultado:
fonte
Você pode tentar desta maneira:
fonte
Você pode usar a função de biblioteca padrão Swift chamada
_stdlib_getDemangledTypeName
assim:fonte
Para obter o nome do tipo como uma string no Swift 4 (não verifiquei as versões anteriores), basta usar a interpolação de string:
Você pode usar
.self
em um tipo em si e atype(of:_)
função em uma instância:fonte
Pode-se também usar espelhos:
NB: Este método também pode ser usado para estruturas e enums. Existe um displayStyle que fornece uma indicação de que tipo de estrutura:
O retorno é uma enumeração para que você possa:
fonte
Swift 5.1
Você pode obter nomes de classe, estrutura, enumeração, protocolo e NSObject
Self.self
.fonte
String(describing: type(of: self))
)Swift 3.0: você pode criar uma extensão como esta. Devolve o nome da classe sem o nome do projeto
fonte
Você pode estender
NSObjectProtocol
no Swift 4 assim:Isso tornará a variável calculada
className
disponível para TODAS as classes. Usar isso dentro de umprint()
inCalendarViewController
será impresso"CalendarViewController"
no console.fonte
Eu tenho procurado esta resposta de vez em quando por um tempo. Eu uso GKStateMachine e gosto de observar alterações de estado e queria uma maneira fácil de ver apenas o nome da classe. Não tenho certeza se é apenas o iOS 10 ou o Swift 2.3, mas nesse ambiente, o seguinte faz exatamente o que eu quero:
fonte
Você pode obter o nome da classe fazendo algo como:
fonte
Para obter o nome da classe como String, declare sua classe da seguinte maneira
E obtenha o nome da classe usando a seguinte sintaxe
fonte
Experimente
reflect().summary
a classe própria ou a instância dynamicType. Desembrulhe os opcionais antes de obter dynamicType, caso contrário, o dynamicType é o wrapper opcional.O resumo é um caminho de classe com os tipos genéricos descritos. Para obter um nome de classe simples do resumo, tente este método.
fonte
As soluções acima não funcionaram para mim. O produzido principalmente as questões mencionadas em vários comentários:
ou
Essas soluções funcionaram no XCode 9, Swift 3.0:
Eu o nomeei
classNameCleaned
para facilitar o acesso e não entrar em conflito comclassName()
alterações futuras :}
Uso:
fonte
Swift 3.0 (macOS 10.10 e posterior), você pode obtê-lo em className
fonte
NSObject
developer.apple.com/reference/objectivec/nsobject/…Eu tentei
type(of:...)
no Playground com o Swift 3. Esse é o meu resultado. Esta é a versão em formato de código.fonte
Swift 5
fonte
Este tipo de exemplo para a classe var. Não inclua o nome do pacote.
fonte
Se você não gosta do nome mutilado, pode ditar seu próprio nome:
No entanto, seria melhor a longo prazo aprender a analisar o nome mutilado. O formato é padrão e significativo e não muda.
fonte
Às vezes, as outras soluções dão um nome não útil, dependendo do objeto que você está tentando olhar. Nesse caso, você pode obter o nome da classe como uma string usando o seguinte.
⌘ clique na função no xcode para ver alguns métodos relacionados que são bastante úteis. ou verifique aqui https://developer.apple.com/reference/objectivec/objective_c_functions
fonte
Swift 5 Você pode obter class_name como uma string com String (descrevendo: Self.self)
fonte
Eu uso no Swift 2.2
fonte
Swift 5.1: -
Você também pode usar a função genérica para obter o nome da classe do objeto como string
Chame esta função usando o seguinte: -
Happy Coding :)
fonte
Swift 5.2:
fonte