用 Swift 比较类型

Comparing types with Swift

我想做类似下面的事情,但是当我尝试查看是否 b == Test.self 时,我收到错误 "Any class is not convertible to MirrorDisposition"。我如何检查一个类型是否等于另一个类型?

class Test {

}

var a = Test.self

var b : AnyClass = a

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

使用“等同于”运算符 ===:

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

这是可行的,因为 class 的类型本身就是一个 class 对象,因此可以 与 ===.

进行比较

它不适用于 structs。也许有人有更好的答案 所有 Swift 类型。

如果你只想比较 class 类型,那么你可以简单地使用 NSStringFromClass 来比较 class 名称,如下所示:

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")
}

如果你想用 == 运算符做对象到对象的相等性检查,你可以让你的测试 class 符合 Equatable 协议。这可以扩展到 Swift 中的 Struct 和 Class 类型,如这篇 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")
}
if b.isKindOfClass(Test) {
    println("yes")
} else {
    println("no")
}

编辑:Swift 3

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

试一试:)

要比较实例,请使用

type(of: instanceA) == type(of: instanceB)