zoukankan      html  css  js  c++  java
  • swift的Hashable

    Conforming to the Hashable Protocol

    To use your own custom type in a set or as the key type of a dictionary, add Hashable conformance to your type. The Hashable protocol inherits from the Equatable protocol, so you must also satisfy that protocol’s requirements.

    The compiler automatically synthesizes your custom type’s Hashable and requirements when you declare Hashable conformance in the type’s original declaration and your type meets these criteria:

    • For a struct, all its stored properties must conform to Hashable.
    • For an enum, all its associated values must conform to Hashable. (An enum without associated values has Hashable conformance even without the declaration.)

    To customize your type’s Hashable conformance, to adopt Hashable in a type that doesn’t meet the criteria listed above, or to extend an existing type to conform to Hashable, implement the hash(into:) method in your custom type.

    In your hash(into:) implementation, call combine(_:) on the provided Hasher instance with the essential components of your type. To ensure that your type meets the semantic requirements of the Hashable and Equatable protocols, it’s a good idea to also customize your type’s Equatable conformance to match.

    As an example, consider a GridPoint type that describes a location in a grid of buttons. Here’s the initial declaration of the GridPoint type:

    /// A point in an x-y coordinate system.

    struct GridPoint {

        var x: Int

        var y: Int

    }

    You’d like to create a set of the grid points where a user has already tapped. Because the GridPoint type is not hashable yet, it can’t be used in a set. To add Hashable conformance, provide an == operator function and implement the hash(into:) method.

    extension GridPoint: Hashable {

        static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {

            return lhs.x == rhs.x && lhs.y == rhs.y

        }

        func hash(into hasher: inout Hasher) {

            hasher.combine(x)

            hasher.combine(y)

        }

    }

    The hash(into:) method in this example feeds the grid point’s x and y properties into the provided hasher. These properties are the same ones used to test for equality in the == operator function.

    Now that GridPoint conforms to the Hashable protocol, you can create a set of previously tapped grid points.

    var tappedPoints: Set = [GridPoint(x: 2, y: 3), GridPoint(x: 4, y: 1)]

    let nextTap = GridPoint(x: 0, y: 1)

    if tappedPoints.contains(nextTap) {

        print("Already tapped at ((nextTap.x), (nextTap.y)).")

    } else {

        tappedPoints.insert(nextTap)

        print("New tap detected at ((nextTap.x), (nextTap.y)).")

    }

    // Prints "New tap detected at (0, 1).")

     https://developer.apple.com/documentation/swift/hashable
  • 相关阅读:
    flask框架+上传文件接口实战【软件测试培训】【多测师_王sir】
    读取Excel中的视频文件地址+requests库下载后存入本地文件夹【软件测试培训】【多测师_王sir】
    UI和接口自动化中的设计模式:单例模式【软件测试培训】【多测师_王sir】
    Python+BeautifulReport生成完美的接口自动化测试报告【多测师_王sir】
    Linux命令中查找以.log结尾文件中不包含某个特定字符串这行的内容【多测师_王sir】
    查询多条数据
    django登录装饰接口封装
    django使用redis作为session缓存
    tinymce配置
    django重写authcenticate方法兼容用户、邮箱、密码认证登录
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10472567.html
Copyright © 2011-2022 走看看