Ao tentar entender um programa, ou em alguns casos extremos, é útil poder realmente descobrir que tipo de coisa é. Eu sei que o depurador pode mostrar algumas informações de tipo, e você geralmente pode confiar na inferência de tipo para não especificar o tipo nessas situações, mas ainda assim, eu realmente gostaria de ter algo como o Python.type()
dynamicType (veja esta pergunta )
Atualização: isso foi alterado em uma versão recente do Swift, obj.dynamicType
agora fornece uma referência ao tipo e não à instância do tipo dinâmico.
Este parece ser o mais promissor, mas até agora não consegui descobrir o tipo real
class MyClass {
var count = 0
}
let mc = MyClass()
# update: this now evaluates as true
mc.dynamicType === MyClass.self
Eu também tentei usar uma referência de classe para instanciar um novo objeto, que faz o trabalho, mas estranhamente me deu um erro dizendo que eu preciso adicionar umrequired
inicializador:
trabalho:
class MyClass {
var count = 0
required init() {
}
}
let myClass2 = MyClass.self
let mc2 = MyClass2()
Ainda é apenas um pequeno passo para descobrir o tipo de um objeto em particular.
edit : removi um número substancial de detalhes agora irrelevantes - veja o histórico de edições se estiver interessado :)
fonte
print(mc)
oudump(mc)
imprimirá um resumo (do qual você pode obtertoString(mc)
oureflect(mc).summary
), que conterá o nome da classe em algum lugar. Mas não está claro como obter apenas o nome da classe.Respostas:
Versão Swift 3:
fonte
var myVar: SomeType!
. O compilador fornece o erro "Não é possível converter o valor do tipo 'SomeType! .Type' (também conhecido como 'ImplicitlyUnwrappedOptional <SomeType> .Type') para o tipo de argumento esperado 'AnyClass' (também conhecido como 'AnyObject.Type') O compilador sugere a adiçãoas! AnyClass
após o tipo, mas depois programa trava com alguma "EXC_BAD_INSTRUCTION" e outros jiberrish que eu não posso decifrar.String
que é passado como tipoAny
,type(of:)
será exibidoAny
, nãoString
.Swift 2.0:
A maneira correta de fazer esse tipo de introspecção de tipo seria com a estrutura Mirror ,
Em seguida, para acessar o próprio tipo a partir da
Mirror
estrutura, você usaria a propriedade da seguintesubjectType
maneira:Você pode usar algo como isto:
fonte
String
eOptional(String)
não são os mesmos.O
dynamicType.printClassName
código é de um exemplo no livro Swift. Não há como saber diretamente o nome de uma classe personalizada, mas você pode verificar um tipo de instância usando ais
palavra - chave, como mostrado abaixo. Este exemplo também mostra como implementar uma função className personalizada, se você realmente deseja o nome da classe como uma sequência.Nota: as
subclasses de
NSObject
já implementam sua própria função className. Se você estiver trabalhando com cacau, basta usar essa propriedade.fonte
subjectType
não está mais disponível edynamicType
causa uma mensagem de descontinuação do compilador.A partir de Xcode 6.0.1 (pelo menos, não tenho certeza de quando o adicionaram), seu exemplo original agora funciona:
Atualizar:
Para responder à pergunta original, você pode realmente usar o tempo de execução Objective-C com objetos Swift simples com êxito.
Tente o seguinte:
fonte
Se você simplesmente precisar verificar se a variável é do tipo X ou se está em conformidade com algum protocolo, poderá usar
is
ouas?
como a seguir:Isso é equivalente
isKindOfClass
em Obj-C.E isso é equivalente a
conformsToProtocol
, ouisMemberOfClass
fonte
as?
conversão condicional também faz o mesmoisKindOfClass
, mas também fornece o resultado da conversão, caso ela seja bem-sucedida.isMemberOfClass
é a condiçãoobject.dynamicType == ClassName.self
.Swift 3:
fonte
is
existe antes de Swift 3 ...?Para Swift 3.0
Para Swift 2.0 - 2.3
fonte
Aqui estão duas maneiras que eu recomendo:
Ou:
Aqui está um exemplo detalhado:
fonte
print( aShape is Square )
,is
operador é mais preferível.Depende do caso de uso. Mas vamos supor que você queira fazer algo útil com seus tipos "variáveis". A
switch
declaração Swift é muito poderosa e pode ajudá-lo a obter os resultados que você está procurando ...Nesse caso, tenha um dicionário simples que contenha pares chave / valor que possam ser UInt, Int ou String. No
.filter()
método do dicionário, preciso me certificar de testar corretamente os valores e testar apenas uma String quando for uma string, etc. A instrução switch torna isso simples e seguro! Ao atribuir 9 à variável do tipo Qualquer, ele faz a troca para Int ser executada. Tente alterá-lo para:..e tente novamente. Desta vez, ele executa o
as String
caso.fonte
Se você receber um aviso "sempre verdadeiro / falhar", pode ser necessário transmitir para Qualquer antes de usar
is
fonte
fonte