2015-01-08 10 views
16

Sto cercando di fare qualcosa di simile a quanto segue, ma quando provo a vedere se b == Test.self ottengo l'errore "Qualsiasi classe non è convertibile in MirrorDisposition". Come posso verificare se un tipo è uguale ad un altro tipo?Confronto dei tipi con Swift

class Test { 

} 

var a = Test.self 

var b : AnyClass = a 

if(b == Test.self) { 
    println("yes") 
} 
else { 
    println("no") 
} 

risposta

26

usi "identica a" operatore ===:

if b === Test.self { 
    print("yes") 
} 
else { 
    print("no") 
} 

Ciò funziona perché il tipo di una classe esso stesso un oggetto di classe e possono quindi essere confrontati con ===.

Non funziona con struct s. Forse qualcuno ha una risposta migliore che funziona per tutti i tipi Swift.

+0

fino a circa un nuovo operatore: D Grazie. – puttputt

+1

Perché non può essere confrontato tra "Any?" E "Any?"? Ho avuto un errore: "L'operatore binario === non può essere applicato a due Qualsiasi? operands' – Kuba

+0

@Kuba: l'operatore '===' è definito solo per le istanze di una * classe. * –

5

Se si desidera solo per confrontare i tipi di classe, allora si può semplicemente utilizzare NSStringFromClass per confrontare i nomi di classe, come di seguito:

class Test {} 

var a = Test.self 
var b : AnyClass = a 

if(NSStringFromClass(b) == NSStringFromClass(Test.self)) { 
    println("yes") 
} else { 
    println("no") 
} 

Se si vuole scoprire o confrontare il tipo di un oggetto, è può usare "se ... è ... {}" sintassi codice qui sotto:

class Test { } 
class Testb { } 

var a = Test.self 
let b : AnyObject = Testb() 

if(b is Test) { 
    println("yes") 
} else { 
    println("no") 
} 

Se si vuole fare un oggetto all'altro controllo di uguaglianza con operatore ==, è possibile rendere la vostra classe di prova conforme alle equatable protocollo. Questo può essere esteso a entrambi i tipi Struct e Class in Swift come spiegato in questo articolo di NSHipster: http://nshipster.com/swift-comparison-protocols/.

Il codice può quindi essere scritto come segue, si prega di notare: questo è il controllo di uguaglianza di oggetti, quindi non è possibile definire b come AnyClass, è necessario invece definire come AnyObject.

class Test: Equatable { } 

// MARK: Equatable 
func ==(lhs: Test, rhs: Test) -> Bool { 
    return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) 
} 

var a = Test() 
var b : AnyObject = a 

if((b as Test) == a) { 
    println("yes") 
} else { 
    println("no") 
} 
15
if b.isKindOfClass(Test) { 
    println("yes") 
} else { 
    println("no") 
} 

Edit: Swift 3

if b.isKind(of: Test.self) { 
    print("yes") 
} else { 
    print("no") 
} 

provare :)

+0

grazie - questo mi ha aiutato a risolvere alcuni errori EXC_BAD_ACCESS particolarmente dolorosi perché l'operatore IS restituiva i falsi positivi. –

+0

@Matt Bolt Oh. Cool :) –

+2

per qualche motivo l'operatore === ("identico a") non ha funzionato durante il controllo di UIAlertController mentre .isKindOfClass ha funzionato bene – Vitalii