2017-10-17 1 views
4

ich brauche die Art von ANYOBJECT zu überprüfen, die eine Int (oder Int16 oder UInt8) Wert, dhWie ANYOBJECT (oder Int) -Typ in XCode 9 unterscheiden - neue Swift Compiler

In Xcode 8 gegeben wurde - Schalt über dem Objekt, mit Fällen: is Uint8, is Int16, is Int funktioniert pefrect.
In Xcode 9 - Es immer den ersten Fall eingeben, der ist möglicherweise wahr.

Hier ist ein Codebeispiel für Spielplatz:

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 Spielplatz Konsole druckt:
Int
Int16

XCode 9 Spielplatz Konsole druckt:
UInt8
UInt8

A. Kann jemand erklären, warum, und/oder anhängen Haben Sie diesbezüglich eine dokumentierte Referenz?
B. Wäre glücklich, dass mir jemand helfen kann, dieselbe Funktionalität in XCode 9 zu erreichen.

Danke.

Antwort

2

Da Swift 3 alle numerischen Typen Any sind, nicht AnyObject

var t1: Any? 
var t2: Any? 

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

Das löst das Problem.

Ich vermute, Gießen an AnyObject überbrückt den Typ zu NSNumber, die jeden Fall entspricht.

+0

Bridging zu NSCFNumber ist genau das, was passiert. Finde das heraus, indem ich 'Typ (von:)' von obj – MatanGold

+0

drucke, denke ich so. 'AnyObject' ist ein beliebiger Klassentyp und' Intxx' ist keine Klasse. Casting als 'AnyObject' muss daher in' NSNumber' umgewandelt werden. – JeremyP

Verwandte Themen