Existe uma maneira de imprimir o tipo de tempo de execução de uma variável rapidamente? Por exemplo:
var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)
println("\(now.dynamicType)")
// Prints "(Metatype)"
println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector
println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method
No exemplo acima, estou procurando uma maneira de mostrar que a variável "breve" é do tipo ImplicitlyUnwrappedOptional<NSDate>
, ou pelo menos NSDate!
.
Respostas:
Atualização setembro de 2016
Swift 3.0: Use
type(of:)
, por exemplotype(of: someThing)
(desde que adynamicType
palavra-chave foi removida)Atualização em outubro de 2015 :
Atualizei os exemplos abaixo para a nova sintaxe do Swift 2.0 (por exemplo,
println
foi substituída porprint
,toString()
é agoraString()
).Nas notas de versão do Xcode 6.3 :
O @nschum aponta nos comentários que as notas de lançamento do Xcode 6.3 mostram outra maneira:
Quais saídas:
Atualização para o Xcode 6.3:
Você pode usar o
_stdlib_getDemangledTypeName()
:e obtenha isso como saída:
Resposta original:
Antes do Xcode 6.3,
_stdlib_getTypeName
havia o nome do tipo mutilado de uma variável. A entrada de blog de Ewan Swick ajuda a decifrar estas strings:por exemplo,
_TtSi
significa oInt
tipo interno de Swift .Mike Ash tem uma ótima entrada de blog que aborda o mesmo tópico .
fonte
_stdlib_getTypeName()
? O REPL integrado não existe mais,swift-ide-test
também não existe, e a impressão do módulo Swift pelo Xcode_
elimina os valores predefinidos.lldb
bastante facilidade no repl. Há também_stdlib_getDemangledTypeName()
, e_stdlib_demangleName()
.image
era um atalho paratarget modules
. Acabei usandotarget modules lookup -r -n _stdlib_
, o que naturalmente é melhor expressa comoimage lookup -r -n _stdlib_ libswiftCore.dylib
dynamicType
palavra-chave foi removida do Swift. Em seu lugar, uma nova função primitivatype(of:)
foi adicionado à linguagem: github.com/apple/swift/blob/master/CHANGELOG.mdEdit: Uma nova
toString
função foi introduzida no Swift 1.2 (Xcode 6.3) .Agora você pode imprimir o tipo desmembrado de qualquer tipo usando
.self
e qualquer instância usando.dynamicType
:Tente ligar
YourClass.self
eyourObject.dynamicType
.Referência: https://devforums.apple.com/thread/227425 .
fonte
someInstance.dynamicType.printClassName()
irá imprimir o nome da classe.Swift 3.0
fonte
É isso que você está procurando?
Imprime "__NSDate"
ATUALIZAÇÃO : observe que isso não parece mais funcionar a partir do Beta05
fonte
Meu Xcode atual é a versão 6.0 (6A280e).
Resultado:
fonte
Optional(...)
, portanto, seu código retornaria apenasOptional
como o Tipo. Também deve aparecervar optionalTestVar: Person? = Person(name:"Sarah")
como Opcional (Pessoa) e var com Pessoa! Como ImplicitlyUnwrappedOptional (Pessoa)A partir do Xcode 6.3 com o Swift 1.2, você pode simplesmente converter valores de tipo no total desmembrado
String
.fonte
Você ainda pode acessar a classe através de
className
(que retorna aString
).Na verdade, existem várias maneiras de obter a classe, por exemplo
classForArchiver
,classForCoder
,classForKeyedArchiver
(todos de retornoAnyClass!
).Você não pode obter o tipo de primitivo (um primitivo não é uma classe).
Exemplo:
Se você deseja obter o tipo de primitivo, precisa usar
bridgeToObjectiveC()
. Exemplo:fonte
import Cocoa
.className
faz parte do suporte AppleScript da Cocoa e definitivamente não deve ser usado para introspecção genérica. Obviamente, não está disponível no iOS.Você pode usar refletir para obter informações sobre o objeto.
Por exemplo, nome da classe de objeto:
fonte
reflect(x).summary
- obrigado!Eu tive sorte com:
fonte
Tipo de uso do Xcode 8 Swift 3.0 (de :)
fonte
No Xcode 8, Swift 3.0
Passos:
1. Obtenha o tipo:
Opção 1:
Opção 2:
2. Converta Tipo em String:
fonte
No Swift 3.0, você pode usar
type(of:)
, pois adynamicType
palavra-chave foi removida.fonte
SWIFT 5
Com a versão mais recente do Swift 3, podemos obter descrições bonitas de nomes de tipos através do
String
inicializador. Como, por exemploprint(String(describing: type(of: object)))
. Ondeobject
pode haver uma variável de instância como matriz, dicionário, anInt
, aNSDate
, instância de uma classe personalizada etc.Aqui está a minha resposta completa: Obter nome da classe do objeto como string no Swift
Essa pergunta está procurando uma maneira de obter o nome da classe de um objeto como string, mas também propus outra maneira de obter o nome da classe de uma variável que não é subclasse de
NSObject
. Aqui está:Eu criei uma função estática que toma como parâmetro um objeto do tipo
Any
e retorna seu nome de classe comoString
:).Eu testei essa função com algumas variáveis como:
e a saída foi:
fonte
Ao usar o Cocoa (não o CocoaTouch), você pode usar a
className
propriedade para objetos que são subclasses de NSObject.Essa propriedade não está disponível para objetos Swift normais, que não são subclasses de NSObject (e, de fato, não há ID de raiz ou tipo de objeto no Swift).
No CocoaTouch, no momento não há uma maneira de obter uma descrição de string do tipo de uma determinada variável. Uma funcionalidade semelhante também não existe para tipos primitivos no Cocoa ou no CocoaTouch.
O Swift REPL pode imprimir um resumo dos valores, incluindo seu tipo, portanto, é possível que esse tipo de introspecção seja possível por meio de uma API no futuro.
EDIT :
dump(object)
parece fazer o truque.fonte
dump(object)
é realmente poderoso. Obrigado.A resposta principal não tem um exemplo prático da nova maneira de fazer isso usando
type(of:
. Então, para ajudar novatos como eu, aqui está um exemplo prático, obtido principalmente dos documentos da Apple aqui - https://developer.apple.com/documentation/swift/2885064-typefonte
Eu tentei algumas das outras respostas aqui, mas a milhagem parece muito sobre qual é o objeto subjacente.
No entanto, encontrei uma maneira de obter o nome da classe Object-C para um objeto, fazendo o seguinte:
Aqui está um exemplo de como você o usaria:
Nesse caso, ele imprimirá o NSDate no console.
fonte
Encontrei esta solução que, esperançosamente, pode funcionar para outra pessoa. Eu criei um método de classe para acessar o valor. Lembre-se de que isso funcionará apenas na subclasse NSObject. Mas pelo menos é uma solução limpa e arrumada.
fonte
No mais recente XCode 6.3 com Swift 1.2, esta é a única maneira que encontrei:
fonte
<swift module name>.<actual class name>
, então você deseja dividir a string com a.
e obter o último token.Muitas das respostas aqui não funcionam com o Swift mais recente (Xcode 7.1.1 no momento da redação).
A maneira atual de obter as informações é criar
Mirror
e interrogar isso. Para o nome da classe, é tão simples quanto:Informações adicionais sobre o objeto também podem ser recuperadas no
Mirror
. Veja http://swiftdoc.org/v2.1/type/Mirror/ para obter detalhes.fonte
No lldb a partir do beta 5, você pode ver a classe de um objeto com o comando:
que gera algo como:
O comando expandido significa algo como:
Frame Variable
(imprima uma variável de quadro)-d run_target
(expanda tipos dinâmicos)Algo útil a saber é que o uso de "Variável de quadro" para gerar valores de variável garante que nenhum código seja executado.
fonte
Encontrei uma solução para classes desenvolvidas por você (ou você tem acesso).
Coloque a seguinte propriedade computada na sua definição de classe de objetos:
Agora você pode simplesmente chamar o nome da classe no seu objeto da seguinte maneira:
Observe que isso só funcionará se sua definição de classe for feita em um arquivo nomeado exatamente como a classe da qual você deseja o nome.
Como esse é geralmente o caso, a resposta acima deve fazê-lo na maioria dos casos . Mas, em alguns casos especiais, você pode precisar descobrir uma solução diferente.
Se você precisar do nome da classe dentro da própria classe (arquivo), basta usar esta linha:
Talvez esse método ajude algumas pessoas por aí.
fonte
Com base nas respostas e comentários de Klass e Kevin Ballard acima, eu iria com:
que será impresso:
fonte
toString(self.dynamicType).componentsSeparatedByString(".").last!
obviamente estava em um contexto de objeto e era capaz de fazer referênciaself
.fonte
Swift versão 4:
Thanks @Joshua Dance
fonte
Swift 4:
Uso:
fonte
Parece não haver uma maneira genérica de imprimir o nome do tipo de um valor arbitrário. Como outros observaram, para instâncias de classe, você pode imprimir,
value.className
mas para valores primitivos parece que, em tempo de execução, as informações de tipo desaparecem.Por exemplo, parece que não há como digitar:
1.something()
e saiaInt
por qualquer valor desomething
. (Você pode, como outra resposta sugerida, usari.bridgeToObjectiveC().className
para dar uma dica, mas na verdade não__NSCFNumber
é o tipo de - exatamente o que será convertido quando ultrapassar o limite de uma chamada de função Objective-C.)i
Eu ficaria feliz em ter provado que está errado, mas parece que a verificação de tipo é feita em tempo de compilação e, como o C ++ (com o RTTI desativado), grande parte das informações de tipo desaparece em tempo de execução.
fonte
Isto é como você começa uma seqüência de tipo do seu objeto ou tipo que é consistente e leva em conta a que o módulo a definição do objeto pertence ou aninhado em. Obras em Swift 4.x.
fonte
Para obter um tipo de objeto ou classe de objeto no Swift , você precisa usar um tipo (de: yourObject)
tipo (de: seuObjeto)
fonte
Não é exatamente o que você procura, mas você também pode verificar o tipo da variável em relação aos tipos Swift da seguinte forma:
Por exemplo.
fonte
Xcode 7.3.1, Swift 2.2:
String(instanceToPrint.self).componentsSeparatedByString(".").last
fonte