Comment faire pour déterminer le type d'une variable en Swift
Est-il une fonction pour déterminer le type de variable Swift? Je suppose qu'il pourrait y avoir quelque chose comme comme type()
en Python.
Je voudrais un moyen de juger si une variable est un objet de la Fondation ou de la variable C dans Swift. Comme NSString vs Chaîne, ou NSArray vs tableau. De sorte que je peux me connecter en console et de voir clairement ce qu'il est.
Par exemple, je voudrais savoir le type inféré pour la première array
ci-dessous:
var array = [1,2,3] //by default NSArray or array?
var array:[Int] = [1,2,3]
var array:NSArray = [1,2,3]
var array:Array<Any> = [1,2,3]
J'ai vu des réponses pour juger si un donné variable est une sorte de donné type dans cette question, mais je vais dire que c'est tout à fait différent de ce que je veux poser.
- Pas que je sache , mais vous pouvez rouler en bas de votre propre?
- J'ai édité question de faire ma déclaration plus claire
- Pourriez-vous donner un exemple du type de code où vous voulez utiliser cette connaissance? Si le type est connu à la compilation, vous pourriez probablement utiliser une fonction générique, quelque chose comme
func show<T>(x:T) { println("\(x) is of type \(T)" }
. Si elle n'est pas connue au moment de la compilation, je ne sais pas si ce serait même possible, car il ne semble pas être une valeur C serait nécessaire d'exécution des métadonnées. (Malheureusement je ne peux pas essayer cela pour moi, car Apple n'a toujours pas approuvé mon compte développeur.) - Je ne suis pas d'accord avec la fermeture de cette question comme un double de Comment obtenir le Type d'un Objet dans Swift. Même si la question écrite serait une bonne double, la réalité est que toutes les réponses, y compris la accepté de répondre, seulement l'adresse de déterminer si une valeur est d'un type donné. À moins que le sens de cette autre question veut onu-accepter cette réponse, je pense qu'il est raisonnable de s'attendre qu'ils étroite de la question sur la façon de vérifier si une valeur est d'un type donné, faisant distinct de cette question.
- Je suis d'accord,de déterminer un type donné et de déterminer le type de directement sont tout simplement pas la même
- J'ai édité cette question de lever l'ambiguïté de stackoverflow.com/q/24091882 et je vote pour la réouverture. Ils sont à la fois utiles, de façon similaire, les questions, mais les réponses sont tout à fait distincte de sorte qu'il serait utile de les garder séparés.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir une référence à l'objet de type d'une valeur à l'aide de la
.dynamicType
de la propriété. C'est l'équivalent en Python detype()
de la fonction, et est mentionné dans la Swift dans la documentation de Référence du Langage: Types: Type Metatype.Avec ce type d'objet, nous sommes en mesure de créer une nouvelle instance du même type tableau.
Nous pouvons voir que cette nouvelle valeur est du même type (
[Int]
) en tentant d'ajouter un float:Si nous l'importation de Cacao et d'utiliser un littéral de tableau avec un mélange de types, nous pouvons voir qu'un
NSArray
est créé:Toutefois, à ce stade, il ne semble pas exister de manière générale, pour générer une chaîne de caractères de la description d'un type d'objet, si cela peut ne pas servir le débogage rôle que vous posiez des questions sur.
Les Types dérivés de
NSObject
ont un.description()
méthode est utilisée dans le SiLo de la réponse,Cependant, ce n'est pas présente sur les types, tels que Swift est intégré dans des tableaux.
obj.description()
, vous pouvez toujours utiliserString(obj)
(cela utiliser la description, si elle est disponible).option+clic sur la variable que vous souhaitez examiner.
Il est possible de le faire, si ce n'est pas forcément facile ni utile:
De sortie:
Vous êtes mieux d'utiliser le
is
etas
mots-clés dans Swift. De nombreuses classes de base de l'utilisation de clusters de classe (comme vous pouvez le voir avec__NSArrayI
(immuable) et__NSArrayM
(mutable).Avis le comportement intéressant. Le
swiftArray
par défaut à l'aide d'un SwiftArray<Int>
tandis que leswiftDictionary
par défautNSMutableDictionary
. Avec ce genre de comportement je ne serais pas vraiment compter sur quoi que ce soit d'un certain type (vérifiez).Quelqu'un a mentionné ci-dessus, mais je pense qu'elle mérite la visibilité comme une réponse plutôt qu'un commentaire. Vous pouvez maintenant simplement le type d'utilisation(de: ___):
rendements
Je utiliser les points d'arrêt pendant le débogage, mais si vous avez besoin de vérifier si elles correspondent à un certain type en cours d'exécution, puis drewag est droit
une autre chose que vous pouvez faire est de tester le type de données avec cette affirmation ne fonctionne que dans le débogage, mais avec affirmation vous pouvez définir des conditions qui, si rencontré application se bloque
peut-être quelque chose comme
assert(let tArray == oldArray as? NSArray[] //if not NSArray app crashes)