O Swift suporta reflexão? por exemplo, existe algo como valueForKeyPath:
e setValue:forKeyPath:
para objetos Swift?
Na verdade, ele ainda tem um sistema de tipo dinâmico, algo como obj.class
em Objective-C?
ios
reflection
swift
Khanh Nguyen
fonte
fonte
Respostas:
Parece que há o início de algum suporte de reflexão:
Do mchambers gist, aqui: https://gist.github.com/mchambers/fb9da554898dae3e54f2
fonte
Mirror
Na verdade, o protocolo cita a palavraIDE
várias vezes._stdlib_getTypeName
pode ajudar.Se uma classe se estende
NSObject
, então toda a introspecção e dinamismo de Objective-C funcionam. Isso inclui:Uma lacuna dessa funcionalidade é o suporte para tipos de valor opcionais Swift. Por exemplo, as propriedades Int podem ser enumeradas e modificadas, mas Int? propriedades não podem. Tipos opcionais podem ser enumerados parcialmente usando reflect / MirrorType, mas ainda não modificados.
Se uma classe não se estende
NSObject
, então apenas a nova reflexão muito limitada (e em andamento?) Funciona (consulte reflect / MirrorType), o que adiciona capacidade limitada de perguntar a uma instância sobre sua classe e propriedades, mas nenhum dos recursos adicionais acima .Quando não está estendendo NSObject, ou usando a diretiva '@objc', o padrão do Swift é o envio estático e baseado em vtable. Isso é mais rápido, no entanto, na ausência de uma máquina virtual, não permite a interceptação do método de tempo de execução. Essa interceptação é uma parte fundamental do Cocoa e é necessária para os seguintes tipos de recursos:
Portanto, é recomendado que clases em aplicativos Cocoa / CocoaTouch implementados com Swift:
Resumo:
Dados de referência: sobrecarga de execução para invocações de método:
(o desempenho real depende do hardware, mas as relações permanecerão semelhantes).
Além disso, o atributo dinâmico nos permite instruir explicitamente ao Swift que um método deve usar despacho dinâmico e, portanto, oferecerá suporte à interceptação.
fonte
A documentação fala sobre um sistema de tipo dinâmico, principalmente sobre
Type
edynamicType
Consulte Tipo de Metatipo (na Referência da Linguagem)
Exemplo:
Agora, supondo que
TestObject
estendeNSObject
Atualmente, não há reflexão implementada.
EDIT: Eu estava aparentemente errado, veja a resposta de stevex. Há uma reflexão simples somente leitura para propriedades incorporadas, provavelmente para permitir que os IDEs inspecionem o conteúdo do objeto.
fonte
Parece que uma API de reflexão Swift não é uma alta prioridade para a Apple no momento. Mas além da resposta de @stevex, há outra função na biblioteca padrão que ajuda.
A partir do beta 6
_stdlib_getTypeName
obtém o nome de tipo mutilado de uma variável. Cole isso em um playground vazio:O resultado é:
A entrada do blog de Ewan Swick ajuda a decifrar essas strings:
por exemplo,
_TtSi
significa oInt
tipo interno do Swift .Mike Ash tem um ótimo post no blog que cobre o mesmo tópico .
fonte
Você pode querer considerar o uso de toString () em vez disso. É público e funciona da mesma forma que _stdlib_getTypeName () com a diferença de que também funciona em AnyClass , por exemplo, em um Playground.
fonte
Nenhuma
reflect
palavra-chave no Swift 5, agora você pode usarfonte
json
desserialização