用Swift比较类型

put*_*utt 20 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")
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 32

使用"same to"运算符===:

if b === Test.self {
    print("yes")
}
else {
    print("no")
}
Run Code Online (Sandbox Code Playgroud)

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

它不适用于structs.也许有人有一个更好的答案,适用于所有Swift类型.

  • 为什么它不能在'Any?`和`Any?`之间进行比较?我有一个错误:`二进制运算符===不能应用于两个Any?operands` (2认同)

Lon*_*ham 27

if b.isKindOfClass(Test) {
    println("yes")
} else {
    println("no")
}
Run Code Online (Sandbox Code Playgroud)

编辑:斯威夫特3

if b.isKind(of: Test.self) {
    print("yes")
} else {
    print("no")
}
Run Code Online (Sandbox Code Playgroud)

试试吧 :)

  • 由于某种原因,===("相同于")运算符在检查UIAlertController时不起作用,而.isKindOfClass运行良好 (2认同)

小智 5

如果您只想比较类类型,那么您只需使用NSStringFromClass来比较类名,如下所示:

class Test {}

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

if(NSStringFromClass(b) == NSStringFromClass(Test.self)) {
    println("yes")
} else {
    println("no")
}
Run Code Online (Sandbox Code Playgroud)

如果要查找或比较对象的类型,可以使用"if ... is ... {}"语法作为下面的代码:

class Test { }
class Testb { }

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

if(b is Test) {
    println("yes")
} else {
    println("no")
}
Run Code Online (Sandbox Code Playgroud)

如果要使用==运算符执行对象相等性检查,可以使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")
}
Run Code Online (Sandbox Code Playgroud)