用Swift比较类型

时间:2015-01-08 21:12:18

标签: ios swift

我希望做类似以下的事情,但是当我试着看看b == Test.self时我得到了错误"任何类都无法转换为MirrorDisposition"。如何检查Type是否等于另一种类型?

class Test {

}

var a = Test.self

var b : AnyClass = a

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

3 个答案:

答案 0 :(得分:29)

使用与#34;相同的" operator ===

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

这是有效的,因为类本身就是一个类对象,因此可以 与===进行比较。

它不能与struct合作。也许有人有一个更好的答案,适用于 所有Swift类型。

答案 1 :(得分:25)

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

编辑:Swift 3

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

尝试一下:)

答案 2 :(得分:5)

如果您只想比较类类型,那么您只需使用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类符合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")
}