运算符“==”应比较类引用,以确定两边是否引用同一对象:

var objectA : NSNumber = 1
var objectB : NSNumber = 1

print(objectA === objectB)
// return true,

所以我的问题是将对象包装到同一个对象中,后端逻辑是如何做到的。

最佳答案

NStUnt是少数几个可以被标记为指针的类中的一个(至少在苹果平台上),我认为这不适用于开源版本的(核心)基金会。
基本上,这意味着nsnumber不是指向位于内存中其他地方的类的实际实例的指针,而是将其值(在本例中是1)直接存储在指针中。你可以亲眼看到:

import Foundation

let x: NSNumber = 1
let y: NSNumber = 2

// Tagged pointers: the number is stored inside the pointer representation.
print(Unmanaged.passUnretained(x).toOpaque())  // 0x0000000000000137
print(Unmanaged.passUnretained(y).toOpaque())  // 0x0000000000000237

class C {}
let c = C()

// Not a tagged pointer; just a regular pointer to allocated memory.
print(Unmanaged.passUnretained(c).toOpaque())  // 0x00007fb32276daa0

同样的优化也可以应用于nsstring和其他类型。有关更多详细信息,请阅读Mike Ash优秀的深入博客文章:
Friday Q&A 2012-07-27: Let's Build Tagged Pointers
Friday Q&A 2015-07-31: Tagged Pointer Strings
不过,不要依赖这个。这只是一个实现细节,并不是所有的nsnumbers都可以用这种方式表示。比较它们是否相等的正确方法是==

关于swift - 为什么Swift标识运算符“===”对NSNumbers返回true?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40796740/

10-09 18:31