一尘不染

如何快速检查两个实例是否具有相同的类/类型

swift

我知道我可以在Swift中检查var的类型 is

if item is Movie {
    movieCount += 1
} else if item is Song {
    songCount += 1
}

但是如何检查两个实例具有相同的类?以下内容不起作用:

if item1 is item2.dynamicType {
    print("Same subclass")
} else {
    print("Different subclass)
}

我可以轻松地添加一个“类”函数,并在每个子类中对其进行更新,以返回唯一的内容,但这似乎有点麻烦。


阅读 293

收藏
2020-07-07

共1个答案

一尘不染

我觉得有必要首先引用 Swift编程语言 文档:

类具有 结构没有的 其他功能:

  • 通过类型转换,您可以在运行时检查和解释类实例的类型。

因此,这对将来的某人可能会有所帮助:

func areTheySiblings(class1: AnyObject!, class2: AnyObject!) -> Bool {
    return object_getClassName(class1) == object_getClassName(class2)
}

和测试:

let myArray1: Array<AnyObject> = Array()
let myArray2: Array<Int> = Array()
let myDictionary: Dictionary<String, Int> = Dictionary()
let myString: String = String()

let arrayAndArray: Bool = self.areTheySiblings(myArray1, class2: myArray2) // true
let arrayAndString: Bool = self.areTheySiblings(myArray1, class2: myString) // false
let arrayAndDictionary: Bool = self.areTheySiblings(myArray1, class2: myDictionary) // false

更新

您还可以重载新的运算符来执行此操作,例如:

infix operator >!<

func >!< (object1: AnyObject!, object2: AnyObject!) -> Bool {
   return (object_getClassName(object1) == object_getClassName(object2))
}

结果:

println("Array vs Array: \(myArray1 >!< myArray2)") // true
println("Array vs. String: \(myArray1 >!< myString)") // false
println("Array vs. Dictionary: \(myArray1 >!< myDictionary)") // false

更新#2

您也可以将其用于自己的新 Swift 类,例如:

class A { }
class B { }

let a1 = A(), a2 = A(), b = B()

println("a1 vs. a2: \(a1 >!< a2)") // true
println("a1 vs. b: \(a1 >!< b)") // false
2020-07-07