Swift 的 hash 和 hashValue 之间的区别

2024-01-08

The HashableSwift 中的协议要求您实现一个名为的属性hashValue:

protocol Hashable : Equatable {
    /// Returns the hash value.  The hash value is not guaranteed to be stable
    /// across different invocations of the same program.  Do not persist the hash
    /// value across program runs.
    ///
    /// The value of `hashValue` property must be consistent with the equality
    /// comparison: if two values compare equal, they must have equal hash
    /// values.
    var hashValue: Int { get }
}

然而,似乎还有一个类似的属性,称为hash.

有什么区别hash and hashValue?


hash是必需的属性NSObject协议 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/,它对所有 Objective-C 对象的基础方法进行了分组,因此它早于 Swift。 默认实现只返回对象地址, 正如人们所看到的NSObject.mm https://opensource.apple.com/source/objc4/objc4-532.2/runtime/NSObject.mm,但可以覆盖该属性 在NSObject子类。

hashValue是 Swift 的必需属性Hashable协议。

两者都通过一个连接NSObject扩展名定义在 Swift 标准库Objective C.swift https://github.com/apple/swift/blob/master/stdlib/public/SDK/ObjectiveC/ObjectiveC.swift:

extension NSObject : Equatable, Hashable {
  /// The hash value.
  ///
  /// **Axiom:** `x == y` implies `x.hashValue == y.hashValue`
  ///
  /// - Note: the hash value is not guaranteed to be stable across
  ///   different invocations of the same program.  Do not persist the
  ///   hash value across program runs.
  open var hashValue: Int {
    return hash
  }
}

public func == (lhs: NSObject, rhs: NSObject) -> Bool {
  return lhs.isEqual(rhs)
}

(对于意义open var, see Swift 中的“open”关键字是什么? https://stackoverflow.com/questions/38947101/what-is-an-open-var-in-swift.)

So NSObject(和所有子类)符合Hashable协议和默认值hashValue执行 返回hash对象的属性。

之间也存在类似的关系isEqual的方法NSObject协议,以及==运营商从Equatable协议:NSObject(和所有子类)符合Equatable协议和默认值==执行 称为isEqual:操作数上的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 的 hash 和 hashValue 之间的区别 的相关文章

  • Xcode MyProjectName-Bridging-Header.h 不存在

    我想开始在我的 Objective C 项目中使用 Swift 所以我添加了一个快速类 import Foundation objc class System NSObject objc func printSome println Pri
  • ObjC <-> Swift 桥接和工厂方法

    我想从 Swift 使用一些 Objective C 类 由于超出了这个问题范围的原因 我的班级init方法被标记为不可用 相反 有一个工厂方法 这是我的班级的简化形式 interface MyClass NSObject instance
  • 除了使用正则表达式之外,在 Swift 中解析 HTML

    下面是我想在 Swift 中解析的 HTML 代码 td class pinyin a href rsc audio voice pinyin pz yi1 mp3 span class mpt1 y span a a href rsc a
  • 在 swift 中设置状态栏的自定义颜色?

    在视图控制器上 我想将状态栏的颜色设置为黑色 但我无法更改它 我为此目的使用下面的代码 func setUpUI self navigationController setNavigationBarHidden true animated
  • Xcode UI 测试 - 通过 id 在 Webview 中查找元素

    我们的应用程序是混合的 包含 webview 我正在尝试使用 Xcode UI 测试自动化我们的应用程序 我能够使用以下方法找到网络按钮 let app XCUIApplication app launch let button app s
  • 从 AF.Request 响应获取数据

    我需要使用 Alamofire 的 Post 请求调用的 json 响应中的数据 但由于某种原因我无法访问该数据 我尝试按照 Alamofire github 文档以及这篇文章进行操作从 AF 响应 JSON 获取数据 https stac
  • 在Swift中计算没有透明度的颜色,通过用透明颜色叠加颜色获得

    我有一个具有非透明颜色的原始 UIVieworgColor 这是由一个覆盖 UIView 覆盖的 该 UIView 具有overlayColor具有透明度 alpha 通道 鉴于这两种颜色orgColor and overlayColor我
  • 如何将代码 AVFoundation Objective C 转换为 Swift?

    我正在 swift 中使用 AVFoundation 来拍照 但我无法将任何 func 代码行从 Objective C 转换为 Swift 我的功能代码是 void capImage method to capture image fro
  • Sprite-kit:沿圆形路径移动元素

    我正在尝试让一个元素沿着圆圈的边缘移动 我在屏幕中间创建并放置了一个圆圈 var base SKShapeNode circleOfRadius 200 Size of Circle base position CGPointMake fr
  • 在 swift 中使用自定义字体[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个用于 swift sprite kit iOS 的字体 该字体用于商业目的 我正在尝试拥有一
  • 使用 Swift 过滤 Realm 对象

    尝试使用以下方法过滤我的领域数据库时 我总是收到以下错误NSPredicate 属性 text 不是类型 getType 对象中的链接 我想过滤我的领域数据库以仅显示其中包含某些特定文本的项目 这是我尝试过的 let realm try R
  • 以编程方式快速呈现视图控制器

    您好 我正在尝试将以下目标 C 代码转换为 swift 以便在单击按钮时从一个视图控制器导航到另一个视图控制器 任何帮助将非常感激 这是摘自苹果的编程指南 void add id sender Create the root view co
  • 创建一个扩展来从 Swift 中的数组中过滤 nils

    我正在尝试编写一个 Array 扩展 它将允许可选 T 数组转换为非可选 T 数组 例如这可以写成一个自由函数 如下所示 func removeAllNils array T gt T return array filter 0 nil r
  • 优化构建中通用函数的 Core Data Swift 转换失败

    我们有一个具有相当广泛的核心数据模型的应用程序 其中有许多用 Objective C 实现的自定义子类 但越来越多的用 Swift 编写的应用程序也使用这些子类 值得一提的是 我们使用 Xcode 7 3 1 针对 iOS 9 3 进行构建
  • UITableView 干扰状态栏

    我正在开发一个具有 UITableViewController 的应用程序 该应用程序显示值列表 如下所示 如何将表格向下移动 使其不会与状态栏冲突 看来我无法对这个场景施加任何限制 所以我不知所措 使用以下 3 个属性UIViewCont
  • 如何测试哈希函数?

    有没有办法测试哈希函数的质量 我希望在哈希表中使用时具有良好的分布 如果这可以在单元测试中验证 那就太好了 EDIT 为了澄清 我的问题是我已经使用了longJava 中的值的方式是第一个 32 位编码一个 ID 第二个 32 位编码另一个
  • 在 Perl 中将整个文件读入哈希值

    我在 Perl 中将文件读入哈希时遇到一些问题 Chr1 supercontig 000000000 1 500 PILOT21 588 1 3 14602 59349 1 Chr1 supercontig 000000001 5 100
  • 在 Swift 中,如何检测哪些 UIControl 事件触发了操作?

    我目前有 4 个 UITextField IBOutlet weak var fNameTextField UITextField IBOutlet weak var lNameTextField UITextField IBOutlet
  • Swift UIToolBar 追加 UIBarButtonItem 项目

    我的语法不正确 有人知道这里缺少什么吗 我正在使用 Xcode 6 beta 3 并且尝试将工具栏项动态添加到 viewDidLoad 中的 手动添加的 工具栏 有两个问题 首先 我无法将工具栏中的项目附加到数组中 其次 虽然编译器允许我调
  • 如何从 UITableViewController 中的静态单元格获取文本字段?迅速

    我的视图层次结构如下所示 UIViewController 类型的 ElevethViewController容器视图嵌入容器视图中的 UITableViewController 类型的 ManagedTableEleventhViewCo

随机推荐