Сравнение типов с Swift

Я хочу сделать что-то вроде следующего, но когда я пытаюсь увидеть, если b == Test.self, я получаю сообщение об ошибке "Любой класс не конвертируется в MirrorDisposition". Как я могу проверить, соответствует ли тип другому типу?

class Test {

}

var a = Test.self

var b : AnyClass = a

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

Ответы

Ответ 1

Используйте оператор "identity to" ===:

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

Это работает, потому что тип класса он сам является объектом класса и поэтому может сравниваться с ===.

Он не будет работать с struct s. Возможно, у кого-то есть лучший ответ, который работает для все типы Swift.

Ответ 2

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

Изменить: Swift 3

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

попробуйте:)

Ответ 3

Если вы просто хотите сравнить типы классов, то вы можете просто использовать NSStringFromClass для сравнения имен классов, как показано ниже:

class Test {}

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

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

Если вы хотите узнать или сравнить тип объекта, вы можете использовать "if... is... {}" синтаксис как код ниже:

class Test { }
class Testb { }

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

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

Если вы хотите сделать проверку объекта для проверки равенства с помощью оператора ==, вы можете сделать свой класс Test совместимым с Equableable. Это можно расширить до типа Struct и Class в Swift, как описано в этой статье NSHipster: http://nshipster.com/swift-comparison-protocols/.

Затем вы можете записать следующий код, обратите внимание: это проверка равенства объектов, поэтому вы не можете определить b как AnyClass, вам нужно определить как 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")
}