J'ai un tableau composé de AnyObject
. Je veux le parcourir et trouver tous les éléments qui sont des instances de tableau.
Comment puis-je vérifier si un objet est d'un type donné dans Swift?
swift
type-inference
typechecking
Encore PTL
la source
la source
Réponses:
Si vous souhaitez vérifier par rapport à un type spécifique, vous pouvez procéder comme suit:
Vous pouvez utiliser "as!" et cela générera une erreur d'exécution s'il
obj
n'est pas de type[String]
Vous pouvez également vérifier un élément à la fois:
la source
?
n'est pas présent. On diraitas
et?
lorsqu'il est combiné sera effectuer une vérification de l' exécution. Quand serait-il approprié de l'utiliseras
sans?
? Merci d'avance.as
sans le?
s'il n'y a aucun moyen que votre programme puisse récupérer de l'objet n'étant pas de ce type car le programme s'arrêtera immédiatement s'il ne l'est pas. L'utilisation de?
dans l'if
instruction permet au programme de continuer.?
dans ce cas effectuerait une vérification de type "générique", si oui, à la clause if, sinon, à la clause else. Sans le?
reste, il ne serait jamais entré et, comme vous l'avez souligné, provoquait une erreur d'exécution. Merci encore.?
permet à l'affectation de retourner,nil
provoquant le retour de l'instruction iffalse
et donc de passer à l'instruction else. Cependant, je pense que cette explication aide à la compréhension, maisif let
c'est en fait un cas spécial dans le compilateurDans Swift 2.2 - 5, vous pouvez désormais:
Puis pour filtrer votre tableau:
Si vous avez plusieurs types à vérifier:
la source
object
comme unString
à l'intérieur des accolades (au moins dans Swift 2), tandis qu'avec lalet
solution, vous pouvez le faire.object
dans le bloc est très bien.object.uppercaseString
car le type de la variable n'est pas converti en ce type, vous venez de vérifier que l'objet (pointé par la variable) est unString
Si vous voulez seulement savoir si un objet est un sous-type d'un type donné, il existe une approche plus simple:
«Utilisez l'opérateur de vérification de type (is) pour vérifier si une instance est d'un certain type de sous-classe. L'opérateur de vérification de type renvoie true si l'instance appartient à ce type de sous-classe et false dans le cas contraire. » Extrait de: Apple Inc. «The Swift Programming Language». iBooks .
Dans ce qui précède, l'expression «d'un certain type de sous-classe» est importante. L'utilisation de
is Circle
etis Rectangle
est acceptée par le compilateur car cette valeurshape
est déclarée commeShape
(une superclasse deCircle
etRectangle
).Si vous utilisez des types primitifs, la superclasse serait
Any
. Voici un exemple:la source
is
toujours ici? Merci.object
asAny
. Mis à jour avec un exemple.AnyObject
est suggéré, semble avoir été répliqué en raison deAnyObject
ne pas hériter deNSObject
. SiAny
c'est différent, ce serait en fait une excellente solution également. Merci.J'ai 2 façons de le faire:
Ou:
Voici un exemple détaillé:
Modifier: 3 maintenant:
la source
isKindOfClass
est une méthode duNSObject
protocole; il ne devrait fonctionner que pour les classes qui l'adoptent (toutes les classes descendant de NSObject, plus toute classe Swift personnalisée qui l'adopte explicitement)pour swift4:
la source
Supposons drawTriangle est une instance de UIView. Pour vérifier si drawTriangle est de type UITableView:
Dans Swift 3 ,
Cela pourrait également être utilisé pour les classes définies par vous-même. Vous pouvez l'utiliser pour vérifier les sous-vues d'une vue.
la source
Pourquoi ne pas utiliser la fonctionnalité intégrée spécialement conçue pour cette tâche?
la source
Soyez averti à ce sujet:
Les quatre dernières lignes renvoient true, c'est parce que si vous tapez
... il affiche "faux" bien sûr, mais un avertissement indique que la conversion de CGRect en chaîne échoue. Certains types sont donc pontés, et le mot-clé 'is' appelle un transtypage implicite.
Vous devriez mieux utiliser l'un d'eux:
la source
Si vous voulez simplement vérifier la classe sans recevoir d'avertissement à cause de la valeur définie inutilisée (let someVariable ...), vous pouvez simplement remplacer le let stuff par un booléen:
Xcode l'a proposé lorsque j'ai utilisé la méthode let et que je n'ai pas utilisé la valeur définie.
la source
Pourquoi ne pas utiliser quelque chose comme ça
dans Swift 3.
la source
Swift 4.2, dans mon cas, en utilisant la fonction isKind.
En savoir plus https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
la source
myObject as? String
renvoienil
simyObject
n'est pas unString
. Sinon, il renvoie unString?
, de sorte que vous pouvez accéder à la chaîne elle-même avecmyObject!
ou la convertir enmyObject! as String
toute sécurité.la source
Swift 3:
la source
Juste pour être complet, basé sur la réponse acceptée et quelques autres:
Mais vous pouvez aussi (
compactMap
aussi "mapper" les valeurs quifilter
ne le font pas):Et une version utilisant
switch
:Mais en restant sur la question, pour vérifier s'il s'agit d'un tableau (ie
[String]
):Ou plus généralement (voir cette autre question réponse ):
la source
as?
ne vous donnera pas toujours le résultat attendu, caras
il ne teste pas si un type de données est d'un type spécifique, mais uniquement si un type de données peut être converti ou représenté comme un type spécifique.Considérez ce code par exemple:
Chaque type de données conforme au
Error
protocole peut être converti enNSError
objet, cela réussira donc toujours . Pourtant, cela ne signifie pas qu'ilerror
s'agit en fait d'unNSError
objet ou d'une sous-classe de celui-ci.Une vérification de type correcte serait:
Cependant, cela vérifie uniquement le type exact. Si vous souhaitez également inclure la sous-classe de
NSError
, vous devez utiliser:la source
Si vous avez une réponse comme celle-ci:
et vous voulez vérifier la valeur
is_stucked
qui sera lue comme AnyObject, tout ce que vous avez à faire est cecila source
Si vous ne savez pas que vous obtiendrez un tableau de dictionnaires ou un dictionnaire unique dans la réponse du serveur, vous devez vérifier si le résultat contient un tableau ou non.
Dans mon cas, je reçois toujours un éventail de dictionnaires, sauf une fois. Donc, pour gérer cela, j'ai utilisé le code ci-dessous pour swift 3.
Ici comme? Array vérifie si la valeur obtenue est un tableau (d'éléments de dictionnaire). Dans les autres cas, vous pouvez gérer s'il s'agit d'un élément de dictionnaire unique qui n'est pas conservé dans un tableau.
la source
Version Swift 5.2 et Xcode: 11.3.1 (11C504)
Voici ma solution de vérification du type de données:
J'espère que cela vous aidera.
la source