我有一个名为Person
的类和两个包含值和引用类型成员的数组。我想检查这些数组是否相等:
class Person {
var name: String
init(name: String) {
self.name = name
}
}
var firstPerson = Person("John")
var secondPerson = Person("James")
var firstArray = ["firstWord", firstPerson, 12]
var secondArray = ["firstWord", secondPerson, 12]
print(firstArray == secondArray)
Swift编译器如何比较这些数组?
"firstWord"
)是否相等,然后检查第二个成员(firstPerson
和secondPerson
)的身份?Equatable
类的Person
协议:顺便说一句,为什么必须在==
类之外声明Person
函数才能正常工作?
func ==(lhs: Person, rhs: Person) -> Bool {
let areEqual = lhs.name == rhs.name
return areEqual
}
答案 0 :(得分:1)
我对此并不是100%肯定。如果您发现一些错误,请告诉我。
首先,这不会编译
var firstPerson = Person("John")
var secondPerson = Person("James")
它应该是
var firstPerson = Person(name: "John")
var secondPerson = Person(name: "James")
firstArray
和secondArray
被推断为NSArray
,因为您将不同类型的值添加到其中,并且您没有明确声明它们为[Any]
。
当您编写firstArray == secondArray
时,代码以这种方式桥接到Objective-C
firstArray.isEqualToArray(secondArray as [AnyObject])
isEqualToArray
方法检查每个元素的相等性。
"firstWord" == "firstWord"
转换为
("firstWord" as NSString).isEqual("firstWord" as NSString)
并且是true
。
两个数组都引用相同的Person
对象,因此它true
12 == 12
转换为
(12 as NSNumber).isEqual(NSNumber(int: 12))
是true
。
所以数组比较的结果是true
。
在这种情况下,没有Objective-C桥接。
在Swift中,如果相关类型为Equatable
,我们可以检查2个数组的相等性。由于Any
不是Equatable
,我们会收到编译错误。
firstArray == secondArray
Binary operator `==` cannot be applied to two [Any] operands