2017-10-17 8 views
4

Je dois vérifier le type de ANYOBJECT qui a été donné un Int (ou Int16 ou UInt8) valeur, à savoirComment différencier ANYOBJECT (ou Int) type dans XCode 9 - nouveau compilateur Swift

Dans Xcode 8 - commutation au-dessus de l'objet, en utilisant des boîtiers: is Uint8, is Int16, is Int fonctionne pefrect.
Dans Xcode 9 - Il faut toujours entrer le premier cas éventuellement vrai.

Voici un exemple de code pour Playground:

var t1: AnyObject? 
var t2: AnyObject? 

t1 = 30 as AnyObject 
t2 = Int16(30) as AnyObject 

if let obj1 = t1 { 
    switch obj1 { 
    case is UInt8: 
     print("UInt8") 
    case is Int16: 
     print("Int16") 
    case is Int: 
     print("Int") 
    default: 
     break 
    } 
} 

if let obj2 = t2 { 
    switch obj2 { 
    case is UInt8: 
     print("UInt8") 
    case is Int16: 
     print("Int16") 
    case is Int: 
     print("Int") 
    default: 
     break 
    } 
} 

XCode 8 jeux impressions console:
Int
Int16

XCode 9 imprime console de jeux:
Uint8
UInt8

A. Quelqu'un peut-il expliquer pourquoi et/ou attacher ed une référence documentée à ce sujet?
B. Serait heureux que quelqu'un puisse m'aider à réaliser la même fonctionnalité dans XCode 9.

Merci.

Répondre

2

Depuis Swift 3 tous les types numériques sont Any, pas AnyObject

var t1: Any? 
var t2: Any? 

t1 = 30 as Any 
t2 = Int16(30) as Any 
... 

Cela résout le problème.

Je suppose que la conversion à AnyObject relie le type à NSNumber qui correspond à n'importe quel cas.

+0

La transition vers NSCFNumber est exactement ce qui se passe. Trouvé cela en imprimant 'type (de:)' de l'obj – MatanGold

+0

Je le pense. 'AnyObject' est n'importe quel type de classe et' Intxx' n'est pas une classe. Casting comme 'AnyObject' doit, par conséquent, le transformer en' NSNumber'. – JeremyP