Eu tenho uma matriz que é composta AnyObject
. Eu quero iterar sobre ele e encontrar todos os elementos que são instâncias de matriz.
Como posso verificar se um objeto é de um determinado tipo no Swift?
swift
type-inference
typechecking
Encore PTL
fonte
fonte
Respostas:
Se você deseja verificar um tipo específico, pode fazer o seguinte:
Você pode usar "como!" e isso gerará um erro de tempo de execução se
obj
não for do tipo[String]
Você também pode verificar um elemento de cada vez:
fonte
?
não está presente? Soa comoas
e?
quando combinado irá realizar verificação de tempo de execução. Quando seria apropriado usaras
sem?
? Desde já, obrigado.as
sem o?
se não houver como o seu programa se recuperar do objeto que não é desse tipo, porque o programa será interrompido imediatamente se não for. O uso de?
naif
instrução permite que o programa continue.?
nesse caso executaria uma verificação de tipo "genérico", se sim, na cláusula if, se não, na cláusula else. Sem o?
else nunca seria inserido e, como você apontou, causa um erro de tempo de execução. Obrigado novamente.?
permite que a atribuição retorne,nil
fazendo com que a instrução if retornefalse
e, portanto, caia na instrução else. No entanto, penso que a explicação ajuda com a compreensão, masif let
é na verdade um caso especial no compiladorNo Swift 2.2 - 5, agora você pode:
Em seguida, para filtrar sua matriz:
Se você tiver vários tipos para verificar:
fonte
object
como umString
suporte interno (pelo menos no Swift 2), enquanto que com alet
solução, você pode fazê-lo.object
o bloco.object.uppercaseString
porque o tipo da variável não é convertido para esse tipo, você apenas verificou se o objeto (apontado pela variável) é umString
Se você deseja apenas saber se um objeto é um subtipo de um determinado tipo, existe uma abordagem mais simples:
“Use o operador de verificação de tipo (is) para verificar se uma instância é de um determinado tipo de subclasse. O operador de verificação de tipo retorna true se a instância for desse tipo de subclasse e false se não for. ” Trecho de: Apple Inc. “A linguagem de programação Swift”. iBooks .
No texto acima, a frase 'de um determinado tipo de subclasse' é importante. O uso de
is Circle
eis Rectangle
é aceito pelo compilador porque esse valorshape
é declarado comoShape
(uma superclasse deCircle
eRectangle
).Se você estiver usando tipos primitivos, a superclasse seria
Any
. Aqui está um exemplo:fonte
is
ainda funcionaria aqui? Obrigado.object
asAny
. Atualizado com um exemplo.AnyObject
é sugerida, parece ter sido replicada porAnyObject
não herdarNSObject
. SeAny
for diferente, isso também seria uma ótima solução. Obrigado.Eu tenho 2 maneiras de fazer isso:
Ou:
Aqui está um exemplo detalhado:
Editar: 3 agora:
fonte
isKindOfClass
é um método doNSObject
protocolo; ele só deve trabalhar para as classes que adotam (todas as classes descendentes de NSObject, além de todo o costume classe Swift, que adota-lo explicitamente)para swift4:
fonte
Suponha que drawTriangle é uma instância do UIView. Para verificar se drawTriangle é do tipo UITableView:
No Swift 3 ,
Isso também pode ser usado para classes definidas por você. Você pode usar isso para verificar as subvisões de uma visualização.
fonte
Por que não usar a funcionalidade incorporada criada especialmente para esta tarefa?
fonte
Esteja avisado sobre isso:
Todas as quatro últimas linhas retornam verdadeiras, porque se você digitar
... ele imprime "false", é claro, mas um aviso diz que a conversão de CGRect para String falha. Portanto, algum tipo é ponte, e a palavra-chave 'is' chama uma conversão implícita.
Você deve usar melhor um destes:
fonte
Se você quiser apenas verificar a classe sem receber um aviso por causa do valor definido não utilizado (deixe someVariable ...), basta substituir o material let por um booleano:
O Xcode propôs isso quando eu usei o let e não usei o valor definido.
fonte
Por que não usar algo assim
no Swift 3.
fonte
Swift 4.2. No meu caso, usando a função isKind.
Leia mais https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
fonte
myObject as? String
retornanil
semyObject
não for aString
. Caso contrário, ele retornará aString?
, para que você possa acessar a própria stringmyObject!
ou convertê-la commyObject! as String
segurança.fonte
Swift 3:
fonte
Apenas para completar, com base na resposta aceita e em algumas outras:
Mas você também pode (
compactMap
também "mapeia" os valores quefilter
não o fazem):E uma versão usando
switch
:Mas, mantendo a questão, para verificar se é uma matriz (ou seja
[String]
):Ou de maneira mais geral (veja esta outra resposta da pergunta ):
fonte
as?
nem sempre fornecerá o resultado esperado porqueas
não testa se um tipo de dados é de um tipo específico, mas apenas se um tipo de dados pode ser convertido ou representado como um tipo específico.Considere este código por exemplo:
Todos os tipos de dados em conformidade com o
Error
protocolo podem ser convertidos em umNSError
objeto, portanto, sempre será bem-sucedido . No entanto, isso não significa queerror
seja de fato umNSError
objeto ou uma subclasse dele.Uma verificação de tipo correta seria:
No entanto, isso verifica apenas o tipo exato. Se você deseja incluir também a subclasse de
NSError
, você deve usar:fonte
Se você tiver uma resposta como esta:
e você deseja verificar o valor
is_stucked
que será lido como AnyObject, tudo que você precisa fazer é issofonte
Se você não souber que receberá uma matriz de dicionários ou dicionário único na resposta do servidor, precisará verificar se o resultado contém uma matriz ou não.
No meu caso, sempre recebendo uma matriz de dicionários, exceto uma vez. Então, para lidar com isso, usei o código abaixo para o swift 3.
Aqui como? Matriz verifica se o valor obtido é matriz (de itens do dicionário). Caso contrário, você pode manipular se for um item de dicionário único que não é mantido dentro de uma matriz.
fonte
Swift 5.2 e versão Xcode: 11.3.1 (11C504)
Aqui está minha solução de verificar o tipo de dados:
Espero que ajude você.
fonte