Swift 中具有引用和类型成员的数组相等
Equality of arrays with reference and type members in Swift
我有一个名为 Person
的 class 和两个包含值和引用类型成员的数组。我想检查这些数组是否相等:
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
) 是否相同吗?
- 如果是这样,我是否需要在以下代码中为
Person
class 遵循 Equatable
协议:
顺便问一下,为什么 ==
函数必须在 Person
class 之外声明才能正常工作?
func ==(lhs: Person, rhs: Person) -> Bool {
let areEqual = lhs.name == rhs.name
return areEqual
}
I'm not 100% sure about this. Should you find some errors please let me know.
首先这个编译不了
var firstPerson = Person("John")
var secondPerson = Person("James")
应该是
var firstPerson = Person(name: "John")
var secondPerson = Person(name: "James")
Swift 将如何比较这些数组?
firstArray
和 secondArray
被推断为 NSArray
,因为您将不同类型的值放入其中并且您没有明确声明它们为 [Any]
。
当您编写 firstArray == secondArray
时,代码会以这种方式桥接到 Objective-C
firstArray.isEqualToArray(secondArray as [AnyObject])
isEqualToArray
方法检查每个元素是否相等。
[0]
"firstWord" == "firstWord"
转换为
("firstWord" as NSString).isEqual("firstWord" as NSString)
并且是 true
.
[1]
两个数组引用同一个 Person
对象,所以它是 true
[2]
12 == 12
转换为
(12 as NSNumber).isEqual(NSNumber(int: 12))
也就是 true
.
回顾
所以数组比较的结果是true
.
如果数组声明为 [Any] 会发生什么?
在这种情况下,没有 Objective-C 桥接。
在 Swift 中,如果相关类型是 Equatable
,我们可以检查 2 个数组是否相等。因为 Any
不是 Equatable
我们会得到一个编译器错误。
firstArray == secondArray
Binary operator `==` cannot be applied to two [Any] operands
我有一个名为 Person
的 class 和两个包含值和引用类型成员的数组。我想检查这些数组是否相等:
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
) 是否相同吗? - 如果是这样,我是否需要在以下代码中为
Person
class 遵循Equatable
协议:
顺便问一下,为什么 ==
函数必须在 Person
class 之外声明才能正常工作?
func ==(lhs: Person, rhs: Person) -> Bool {
let areEqual = lhs.name == rhs.name
return areEqual
}
I'm not 100% sure about this. Should you find some errors please let me know.
首先这个编译不了
var firstPerson = Person("John")
var secondPerson = Person("James")
应该是
var firstPerson = Person(name: "John")
var secondPerson = Person(name: "James")
Swift 将如何比较这些数组?
firstArray
和 secondArray
被推断为 NSArray
,因为您将不同类型的值放入其中并且您没有明确声明它们为 [Any]
。
当您编写 firstArray == secondArray
时,代码会以这种方式桥接到 Objective-C
firstArray.isEqualToArray(secondArray as [AnyObject])
isEqualToArray
方法检查每个元素是否相等。
[0]
"firstWord" == "firstWord"
转换为
("firstWord" as NSString).isEqual("firstWord" as NSString)
并且是 true
.
[1]
两个数组引用同一个 Person
对象,所以它是 true
[2]
12 == 12
转换为
(12 as NSNumber).isEqual(NSNumber(int: 12))
也就是 true
.
回顾
所以数组比较的结果是true
.
如果数组声明为 [Any] 会发生什么?
在这种情况下,没有 Objective-C 桥接。
在 Swift 中,如果相关类型是 Equatable
,我们可以检查 2 个数组是否相等。因为 Any
不是 Equatable
我们会得到一个编译器错误。
firstArray == secondArray
Binary operator `==` cannot be applied to two [Any] operands