【问题标题】:How to add the Hashable protocol to CLLocationCoordinate2D using an extension in SwiftUI如何使用 SwiftUI 中的扩展将 Hashable 协议添加到 CLLocationCoordinate2D
【发布时间】:2021-02-19 22:41:07
【问题描述】:

所以我有一个自定义结构,其中一个属性为 String 类型,另一个属性为 CLLocationCoordinate2D。显然,String 符合 Hashable,如果我可以扩展 CLLocationCoordinate2D 以符合 Hashable,我的自定义结构也将是 Hashable。这是我扩展 CLLocationCoordinate2D 的尝试:

extension CLLocationCoordinate2D {
    static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(self.latitude) //wasn't entirely sure what to put for the combine parameter but I saw similar things online
    }
}

【问题讨论】:

    标签: swift swiftui cllocation hashable


    【解决方案1】:

    您需要明确声明Hashable

    extension CLLocationCoordinate2D: Hashable {
        public static func == (lhs: Self, rhs: Self) -> Bool {
            return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude
        }
        
        public func hash(into hasher: inout Hasher) {
            hasher.combine(latitude)
            hasher.combine(longitude)
        }
    }
    

    【讨论】:

      【解决方案2】:

      CoreLocation 和 MapKit 尚未正确 Swiftified。我建议为他们重用功能。

      extension CLLocationCoordinate2D: HashableSynthesizable { }
      extension MKCoordinateRegion: HashableSynthesizable { }
      extension MKCoordinateSpan: HashableSynthesizable { }
      
      /// A type whose `Hashable` conformance could be auto-synthesized,
      /// but either the API provider forgot, or more likely,
      /// the API is written in Objective-C, and hasn't been modernized.
      public protocol HashableSynthesizable: Hashable { }
      
      public extension HashableSynthesizable {
        static func == (hashable0: Self, hashable1: Self) -> Bool {
          zip(hashable0.hashables, hashable1.hashables).allSatisfy(==)
        }
      
        func hash(into hasher: inout Hasher) {
          hashables.forEach { hasher.combine($0) }
        }
      }
      
      private extension HashableSynthesizable {
        var hashables: [AnyHashable] {
          Mirror(reflecting: self).children
            .compactMap { $0.value as? AnyHashable }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 2011-12-21
        • 1970-01-01
        • 2017-07-11
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        相关资源
        最近更新 更多