当前位置: 首页 > 面试题库 >

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

穆子琪
2023-03-14
问题内容

我知道我可以在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)
}

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


问题答案:

我觉得有必要首先引用 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


 类似资料:
  • 问题内容: 假设我有一个类A,而B,C,D是从A派生的。 如果我想知道所引用的对象的类型是什么,可以声明: 这是因为我确定从A派生的类只有B,C和D。 但是,如果我只想检查两个引用是否指向同一种对象,该怎么办? 所以像这样: 但是当然语法是错误的,如何在没有1000 if-else的情况下进行检查? 问题答案: 你的意思是 即使和属于相同的特定类,也应返回true 。 但是,如果与进行比较,则此方

  • 大家好,我想检查一下,例如在Firebase中创建一个文档集合之前,如果object.name、object.title、object.velocity....只是一个空格("),或者它们在打字稿中为空(Ionic 4),但我认为还有另一种更快的方法,最好的建议是什么? 我所做的是,但我认为是这么长...: 非常感谢。

  • 如何检查两个数组(循环)是否具有相同顺序的相同元素。例如,让我们以数组[1,2,3,4]为例。 对于[2,3,4,1]、[3,4,1,2]、[4,1,2,3],测试应返回true,但对于[1,3,2,4]、[1,4,2,3]或[1,2,3,5]则不返回true。 我最初的方法是找到第一个匹配项——每个数组中一个相等的元素——并将这两个元素视为各自数组的初始元素,我逐个比较了数组的其余元素。 有没有

  • 每个人如何检查两个堆栈是否具有相同的值? 例如,在stack1中我有[1,3,4,5],在stack2中我有[4,3,1,5],因此堆栈具有相同的值,并且Method需要返回true。 此外,堆栈必须(最终)与给定的堆栈相同(具有原始值和相同的顺序)。 我已经开始做了,但不幸的是,效果不好: 提前谢谢。

  • 假设我有一组数组,包括和,我想检查它们是否相等。一般来说,我可以只使用(除了一些我现在忽略的愚蠢的情况)。 但是,这会计算的整个数组,这通常是不需要的。我的数组非常大,而且我有很多数组,两个数组相等的概率很小,所以很可能,在函数返回False之前,我只需要计算的一小部分,所以这对我来说不是一个最佳解决方案。 我尝试使用内置的函数,并结合: 然而,在两个数组相等的情况下,这似乎要慢得多,总的来说,它

  • 我试图在我的实体中有两个相同域类的字段,但我得到了这个错误: org.hibernate.mappingException:无法确定表:Outhories中:com.packt.webapp.domain.user的类型,列:[org.hibernate.mapping.column(author)] 我只想将意见映射到已评论的用户,并将评论的作者存储在字段中。当我移除字段时,一切正常。这个例子有