首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >==与===的区别

==与===的区别
EN

Stack Overflow用户
提问于 2014-06-02 20:35:12
回答 10查看 122.5K关注 0票数 329

在斯威夫特中,似乎有两个相等的运算符:双等于(==)和三元等于(===),,两者之间有什么区别?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2018-06-01 14:37:20

简而言之:

==运算符检查它们的实例值是否相等,"equal to"

===操作符检查引用是否指向同一个实例,"identical to"

长答案:

类是引用类型,多个常量和变量可以在幕后引用同一个类的单个实例。类引用停留在运行时堆栈(RTS)中,它们的实例停留在内存的堆区。当您用==控制相等时,这意味着如果它们的实例是相等的。它不需要是相同的实例才是平等的。为此,您需要向自定义类提供相等的条件。默认情况下,自定义类和结构不会接收等效操作符的默认实现,称为“等于”操作符==和“不等于”操作符!=。为此,您的自定义类需要符合Equatable协议及其static func == (lhs:, rhs:) -> Bool函数

让我们来看看例子:

代码语言:javascript
复制
class Person : Equatable {
    let ssn: Int
    let name: String

    init(ssn: Int, name: String) {
        self.ssn = ssn
        self.name = name
    }

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.ssn == rhs.ssn
    }
}

P.S.:,因为ssn(社会保险号码)是唯一的号码,所以您不需要比较它们的名称是否相等。

代码语言:javascript
复制
let person1 = Person(ssn: 5, name: "Bob")
let person2 = Person(ssn: 5, name: "Bob")

if person1 == person2 {
   print("the two instances are equal!")
}

虽然person1和person2引用指向堆区域中的两个不同的实例,但它们的实例是相等的,因为它们的ssn数相等。所以输出将是the two instance are equal!

代码语言:javascript
复制
if person1 === person2 {
   //It does not enter here
} else {
   print("the two instances are not identical!")
}

===操作符检查引用是否指向同一个实例,"identical to".由于person1和person2在堆区有两个不同的实例,所以它们是不相同的,并且输出the two instance are not identical!

代码语言:javascript
复制
let person3 = person1

P.S:类是引用类型,使用此赋值操作将person3 1的引用复制到person3,因此两个引用都指向堆区域中的相同实例。

代码语言:javascript
复制
if person3 === person1 {
   print("the two instances are identical!")
}

它们是相同的,输出将是the two instances are identical!

票数 196
EN

Stack Overflow用户

发布于 2014-06-02 20:37:03

!=====是标识运算符,用于确定两个对象是否具有相同的引用。

Swift还提供了两个标识操作符(===和!==),用于测试两个对象引用是否都引用同一个对象实例。

摘录自:苹果公司。“斯威夫特编程语言”iBooks。https://itun.es/us/jEUH0.l

票数 258
EN

Stack Overflow用户

发布于 2014-08-15 21:02:40

在Objective和Swift中,==!=运算符测试数字值的值相等(例如,NSIntegerNSUIntegerint、目标C中的IntUInt等)。对于对象(NSObject/NSNumber和objects中的子类以及Swift中的引用类型),==!=分别测试对象/引用类型是相同的--即相同的散列值--或者不是相同的东西。

代码语言:javascript
复制
let a = NSObject()
let b = NSObject()
let c = a
a == b // false
a == c // true

Swift的身份平等操作符,===!==,检查引用相等--因此,很可能应该称为引用平等操作符。

代码语言:javascript
复制
a === b // false
a === c // true

还值得指出的是,Swift中的自定义引用类型(不对符合等价类的类进行子类)不会自动实现相等于运算符,但标识相等操作符仍然适用。另外,通过实现==,可以自动实现!=

代码语言:javascript
复制
class MyClass: Equatable {
  let myProperty: String

  init(s: String) {
    myProperty = s
  }
}

func ==(lhs: MyClass, rhs: MyClass) -> Bool {
  return lhs.myProperty == rhs.myProperty
}

let myClass1 = MyClass(s: "Hello")
let myClass2 = MyClass(s: "Hello")
myClass1 == myClass2 // true
myClass1 != myClass2 // false
myClass1 === myClass2 // false
myClass1 !== myClass2 // true

对于其他类型,例如两种语言中的结构,都不实现这些相等运算符。但是,可以在Swift中创建自定义操作符,例如,这将使您能够创建一个操作符来检查CGPoint的相等性。

代码语言:javascript
复制
infix operator <==> { precedence 130 }
func <==> (lhs: CGPoint, rhs: CGPoint) -> Bool {
  return lhs.x == rhs.x && lhs.y == rhs.y
}

let point1 = CGPoint(x: 1.0, y: 1.0)
let point2 = CGPoint(x: 1.0, y: 1.0)
point1 <==> point2 // true
票数 63
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24002819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档