2015-01-08 11 views
16

Czekam na zrobienie czegoś podobnego, ale gdy próbuję sprawdzić, czy b == Test.self dostaję błąd "Każda klasa nie jest wymienialna na MirrorDisposition". Jak mogę sprawdzić, czy Typ jest równy innemu typowi?Porównywanie typów ze Swiftem

class Test { 

} 

var a = Test.self 

var b : AnyClass = a 

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

Odpowiedz

26

Użyj „identycznego” operator ===:

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

To działa, ponieważ typ klasy to sam obiekt klasy i dlatego mogą być porównywane z ===.

Nie będzie działać z struct s. Być może ktoś ma lepszą odpowiedź, która działa dla wszystkich typów Swift.

+0

TIL o nowego operatora: D Dzięki. – puttputt

+1

Dlaczego nie można go porównać między "Any?" I "Any?"? Wystąpił błąd: 'Operatora binarnego === nie można zastosować do dwóch dowolnych? operandy' – Kuba

+0

@Kuba: Operator '===' jest zdefiniowany tylko dla instancji klasy *. * –

5

Jeśli chcesz tylko porównać typy klas, a następnie można po prostu użyć NSStringFromClass porównać nazwy klas, jak poniżej:

class Test {} 

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

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

Jeśli chcesz dowiedzieć się, czy porównanie typ obiektu, ty można użyć „jeżeli ... to ... {}” składni kodu poniżej:

class Test { } 
class Testb { } 

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

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

Jeśli chcesz zrobić obiektu do obiektu sprawdzenie równości z operatora ==, można dokonać klasa testowa zgodną Equatable protokół. Można to rozszerzyć na typy struktur i klas w Swift, jak wyjaśniono w tym artykule NSHipster: http://nshipster.com/swift-comparison-protocols/.

Twój kod może być zapisany jak poniżej, proszę zauważyć: to jest sprawdzanie równości obiektów, więc nie możesz zdefiniować b jako AnyClass, musisz zdefiniować jako 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") 
} 

spróbować :)

+0

dzięki - pomogło mi to rozwiązać niektóre szczególnie bolesne błędy EXC_BAD_ACCESS, ponieważ operator IS zwracał fałszywe alarmy. –

+0

@Matt Bolt Oh. Fajnie :) –

+2

z jakiegoś powodu operator === ("identyczny z") nie działał podczas sprawdzania kontrolera UIAlertController, gdy funkcja .isKindOfClass działała dobrze – Vitalii

Powiązane problemy