假设我正在Swift中实现一个根类,我声明该根类采用了Equatable
协议(我希望能够知道我类型的数组是否包含给定的实例)。
*在此特定情况下,将协议的所需==
运算符实现为之间有 *什么区别( 如果有的话):
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
…而不是仅仅这样做:
public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
return (lhs === rhs)
}
作为参考,这是文档中所说的ObjectIdentifier()
:
类实例或元类型的唯一标识符。在Swift中,只有类实例和元类型才具有唯一标识。对于结构,枚举,函数或元组,没有身份的概念。
......这是什么的“基本算法”一节雨燕编程语言(斯威夫特3)表示,有关===
操作:
注意
Swift还提供了两个标识运算符(
===
和!==
),用于测试两个对象引用是否都引用同一对象实例。有关更多信息,请参见类和结构。
类实例没有区别,请参见ObjectIdentifier.swift中的以下
注释:
/// Creates an instance that uniquely identifies the given class instance.
///
/// The following example creates an example class `A` and compares instances
/// of the class using their object identifiers and the identical-to
/// operator (`===`):
///
/// class IntegerRef {
/// let value: Int
/// init(_ value: Int) {
/// self.value = value
/// }
/// }
///
/// let x = IntegerRef(10)
/// let y = x
///
/// print(ObjectIdentifier(x) == ObjectIdentifier(y))
/// // Prints "true"
/// print(x === y)
/// // Prints "true"
///
/// let z = IntegerRef(10)
/// print(ObjectIdentifier(x) == ObjectIdentifier(z))
/// // Prints "false"
/// print(x === z)
/// // Prints "false"
///
从for的实现中==``ObjectIdentifier
也可以明显看出,该
实现只比较指向对象存储的指针:
public static func == (x: ObjectIdentifier, y: ObjectIdentifier) -> Bool {
return Bool(Builtin.cmp_eq_RawPointer(x._value, y._value))
}
这正是该===
操作
确实还有:
public func === (lhs: AnyObject?, rhs: AnyObject?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return Bool(Builtin.cmp_eq_RawPointer(
Builtin.bridgeToRawPointer(Builtin.castToUnknownObject(l)),
Builtin.bridgeToRawPointer(Builtin.castToUnknownObject(r))
))
case (nil, nil):
return true
default:
return false
}
}
ObjectIdentifier
符合Hashable
,因此如果要为您的类实现该协议,将非常有用:
extension MyClass: Hashable {
var hashValue: Int {
return ObjectIdentifier(self).hashValue
}
}
还可以为未定义的元类型(例如ObjectIdentifier(Float.self)
)创建对象标识符===
。
问题内容: 如果移位的数字为正,>>>和>>的工作原理相同。 如果移位数为负,>>>将最高有效位填充为1,而>>操作将MSB填充为0。 我的理解正确吗? 如果负数是在MSB设置为1的情况下存储的,而不是Java使用2s补码的方式,则运算符的行为将完全不同,对吗? 问题答案: 表示负数的方式称为2的补码。为了演示其工作原理,以-12为例。12的二进制值为00001100(假设整数为8位,尽管实际上它
问题内容: 和运算符之间有什么区别,它们的用例是什么?他们俩似乎都是为了一项任务? 问题答案: 仅是赋值运算符。 是Short变量声明子句语法的一部分。 though虽然有一些规则。
问题内容: 和之间有什么区别? 问题答案: 假设的类型和是引用类型: 在Java中,将始终比较身份 -即两个值是否是对同一对象的引用。这也称为引用相等。Java没有任何用户定义的运算符重载。 在中,这取决于。除非有一个重载的运算符来处理它,否则==的行为类似于Java(即比较引用相等性)。但是,如果存在一个与and 的编译时类型匹配的重载(例如,如果它们都被声明为字符串),那么将调用该重载。这可以
问题内容: 在PHP中,和运算符之间有什么区别吗? 在手册中,它指出: 我猜没有太大的区别,但我很好奇。 问题答案: 在主要的Zend实现中,没有任何区别。您可以从PHP语言扫描程序的Flex描述中获取它: 生成的令牌在哪里。因此,Bison 解析器不会区分和标记,而是将它们等同对待:
本文向大家介绍解释==和is在Python中的运算符之间的区别。,包括了解释==和is在Python中的运算符之间的区别。的使用技巧和注意事项,需要的朋友参考一下 ==运算符 ==运算符通过检查对象值的相等性来比较操作数。 是运算符 is运算符通过检查对象是否相同来比较操作数。 示例 以下是Python中的程序以展示差异。 输出结果
问题内容: 据我所知,操作员会执行以下操作:(如果我错了,请纠正我。) 分配内存,然后返回分配的内存的第一个块的引用。(显然,内存是从堆分配的。) 初始化对象(调用构造函数。) 运算符也以类似的方式工作,只是它对数组中的每个元素都执行此操作。 谁能告诉我这两个运算符在C ++和Java中有何不同: 就其生命周期而言。 如果他们无法分配内存怎么办。 问题答案: 在C ++中,… 对于类型的对象分配足